自动装配

自动装配是指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中的简单流程总结

  1. 去META-INF/spring-autoconfigure-metadata.properties中加载自动装配的筛选条件元数据,用于后面去筛选符合条件的配置类
    在这里插入图片描述
  2. 获取所有符合条件的配置类,完成自动装配
    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容器中,实现自动装配。

细节请自行阅读源码

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐