SpringBoot的自动装配原理(含例子和源码分析)
Posted 若曦`
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot的自动装配原理(含例子和源码分析)相关的知识,希望对你有一定的参考价值。
1. SpringBoot的自动装配原理总结
① SpringBoot应用在启动后,回先加载所有的自动配置类,也就是xxxxxAutoConfiguration类,并加载到ioc容器中成为组件
② 这些配置组件从xxxxxProperties类中获取数据(一些有默认信息)
③ 组件获取信息后,就会转移到application.yaml或.properties配置文件中,成为springboot核心配置文件中的内容
④ 如果application.yml中有对应的配置信息,那么就会直接读取配置信息,不会覆盖配置信息
流程总结:xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties
在SpringBoot的源码中,我们可以看见一个autoconfigure的包,这就是自动装配的包
打开继续看,会发现有很多以AutoConfiguration结尾的类,这就是自动配置类
@EnableConfigurationProperties(xxx.class)的作用
表示开启某个类的自动装配属性功能,该类需要使用@ConfigurationProprties注解
@ConfigurationProprties(prefix=“xxx”) 的作用
表示这个类是一个需要装配属性的类,这里的perfix前缀值就是代表的在application.properties中的key
@Import({xxx,class})的作用
让容器中自动创建出这个类的组件、默认组件的名字就是全类名
以DataSource的自动装配为例
可以看见类上面有一个@EnableConfigurationProperties注解,指定了DataSourceProperties.class
进入DataSourceProperties.class,就可以看见类上的@ConfigurationProperties注解,设置了前缀为spring.datasource,类中的属性就是在application.properties中去设置的
上述的前缀也就是在application.properties中对应的key值,通过在配置文件中使用key-value形式赋值
DataSource的自动装配流程如下:
① springboot启动后,先加载DataSourceAutoConfiguration类
②从注解@EnableConfigurationProperties(DataSourceProperties.class),找到对应的属性类
③ 从application.properties中读取信息,配置到该类的属性中(如果配置文件没有则使用默认信息)
2. 自定义一个自动装配的类
SpringBoot可以采用俩种方式自动装配类的属性
(1) 在xxxxxAutoConfiguration类上使用@Component+@ConfigurationProprties
@Component用其他容器注解也可以,就是代表要注入到ioc容器中
① 创建一个CarAutoConfiguration类,并使用上述注解
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "car")
public class CarAutoConfiguration {
int carId;
String carName;
}
@ConfigurationProprties(prefix=“car”) 这里的perfix前缀就是代表的在application.properties中的key
② 在application.properties中编写配置
server.port=8080
car.carId=123
car.carName=小明
③ 创建一个controller测试
@RestController
public class TestController {
@Autowired
CarAutoConfiguration car;
@RequestMapping("/test")
public String testMyCar(){
return car.getCarId()+"==="+car.getCarName();
}
}
发现car的信息通过application.properties成功配置
(2) 在xxxxxAutoConfiguration类上使用@EnableAutoConfiguration,并在xxxxxProperties类上使用@ConfigurationProprties和@Component
@EnableConfigurationProperties(xxx.class) 就是代表开启某个类的属性装配
① CarAutoConfiguration.class
@EnableConfigurationProperties({CarProperties.class})
public class CarAutoConfiguration {
}
② CarProperties.class
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "car")
public class CarProperties {
int carId;
String carName;
}
测试同样成功
3. @Configuration、@Import、@Conditional的作用
(1) @Configuration 作用于类上,告诉springboot这是一个配置类
//proxyBeanMethods:代理bean的方法
// * Full模式(proxyBeanMethods = true) :单例模式 (默认)
// * Lite模式(proxyBeanMethods = false) : 多例模式
@Configuration(proxyBeanMethods = true)
public class MyConfig {}
(2) @Import(xxx.class)
表示往容器中注入xxx.class这个组件
(3) @Conditional
作用于类上,表示条件注入:当满足某种条件才将该类注入到ioc容器中
@ConditionalOnMissingBean(name = "config") //表示ioc容器中没有config这个组件才将MyConfig类注入到ioc容器中
public class MyConfig {}
4. 替换springboot的默认组件
在配置类中,使用@Bean注解,可以使用自定义组件,覆盖掉springboot的默认组件
@Configuration(proxyBeanMethods = true)
//代表往容器中注入CarProperties.class这个类
@Import(CarProperties.class)
@ConditionalOnMissingBean(name = "config") //表示ioc容器中没有config这个组件才将MyConfig类注入到ioc容器中
public class MyConfig {
@Bean
public CharacterEncodingFilter filter(){
//可以在这里覆盖掉springboot的默认CharacterEncodingFilter组件,返回自己的
return null;
}
}
5. SpringBoot初始加载的自动配置类流程(源码分析)
进入@SpringBootApplication注解查看步骤
可见SpringBootApplication是一个复合注解
进入@EnableAutoConfiguration注解
进入AutoConfigurationImportSelector.class
在该类中可以看见有一个getAutoConfigurationEntry方法,用于获取自动配置项,该方法又调用了 getCandidateConfigurations()方法,获取候选配置
进入getConfigurations()方法,可以看见获取了spring的加载工厂
进入spring工厂加载类,可以看见工厂资源位置是在META-INF下的spring.factorys中
spring.factorys是在springboot的自动装配包中
进入spring.factorys
在该工厂文件中,可以看见开启了一大堆的自动配置
spring.factories的语法解释
factories和properties的语法是完全一致的,一般情况下是:
com.xxx.Interface = com.xxx.Impl
出现多个时
com.xxx.Interface =
com.xxx.Impl1,
com.xxx.Impl2,
com.xxx.Impl3
key一般是接口,而value是接口的实现
springboot初始加载的自动配置类流程总结
① 通过SpringBootApplication找到springboot应用的入口
② 获取默认配置项,从/META-INF/spring.factories中获取
③ 获取到自动配置项后,进行解析,将其中的自动配置类加载到ioc容器
(在spring.factorys中写死了spring-boot一启动就要给容器中加载的所有配置类)
以上是关于SpringBoot的自动装配原理(含例子和源码分析)的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot启动流程分析:SpringBoot自动装配原理实现
程序员必备技能之SpringBoot的自动装配原理,很详细,建议收藏!!!