简单总结SpringBoot的自动装配原理及流程
自动装配自动装配是指SpringBoot会自动将Bean装配到IoC容器中。例如我们添加了Redis的starter依赖,那么我们需要使用RedisTemplate的时候,直接使用@Autowried将RedisTemplate从IoC容器中拿来注入就可以使用,不需要我们自己去使用XML或者JavaConfig去把RedisTemplate装配到IoC容器。@EnableXXXSpring提供了@
自动装配
自动装配是指SpringBoot会自动将Bean装配到IoC容器中。例如我们添加了Redis的starter依赖,那么我们需要使用RedisTemplate的时候,直接使用@Autowried将RedisTemplate从IoC容器中拿来注入就可以使用,不需要我们自己去使用XML或者JavaConfig去把RedisTemplate装配到IoC容器。
@EnableXXX
Spring提供了@Enable来将相关组件的Bean装配到IoC容器。@Enable是对于JavaConfig的@Configuratin和@Bean的封装,在@Enable中有一个@Import可以用于导入相关的配置类,然后将配置类中配置的Bean装配到IoC容器。
例如下面的这个配置类,配置了一个Bean:MyBean
@Configuration
public class MyBeanConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
可以自定义一个@EnableXXX注解,在里面的@Import中导入想要导入的配置类。例如@EnableMyBean,在里面的@Import中导入MyBeanConfiguration这个类,就可以把MyBean装配到IoC容器中。
@EnableAutoConfiguration
在@SpringBootApplication中有@EnableAutoConfiguration注解,里面最主要的两个注解就是@Import和@EnableAutoConfigurationPackage。
@EnableAutoConfigurationPackage的作用是将注解的类(即SpringBootApplication启动类)所在的包及其子包中的所有组件加载到IoC容器,所以我们写的包含@Service、@Controller等注解的类都要放在启动类的子包中。
@EnableAutoConfiguration中的@Import与在@Enable中的不一样,不是去加载单个配置类,而是加载一个AutoConfigurationImportSelector类。AutoConfigurationImportSelector类实现了ImportSelector接口,里面只有一个抽象方法selectImports可以返回一个String数组。在AutoConfigurationImportSelector类中的实现就是返回一个需要导入的所有配置类名称。
AutoConfigurationImportSelector中的简单流程总结
- 去META-INF/spring-autoconfigure-metadata.properties中加载自动装配的筛选条件元数据,用于后面去筛选符合条件的配置类
- 获取所有符合条件的配置类,完成自动装配
2.1 首先获得@EnableAutoConfiguration中的exclude、excludeName等属性
2.2 使用SpringFactioriesLoader去扫描classpath下的META-INF/spring.factories文件,以EnableAutoConfiguration为key去获取value,value就是所有可以自动装配的配置类的全路径名
2.3 去除重复的配置类
2.4 根据筛选条件元数据、exclude等将不需要的配置类去除
2.5 进行广播
2.6 返回过滤后的配置类集合
SpringBoot的自动装配就是通过拿到所有的配置类然后把配置类中配置的Bean全都加载到IoC容器中,实现自动装配。
细节请自行阅读源码
更多推荐
所有评论(0)