一、介绍
@EnableAutoConfiguration
和大多数@Ebable…注解一样,都是借助@Import将特定的Bean加载到IOC容器中- 属于SpringBoot,
@SpringBootApplication
就包含该注解 - 项目启动会扫描所有的
classpath下META-INF/spring.factories
配置文件,将org.springframework.boot.autoconfigure.EnableAutoConfiguration
(EnableAutoConfiguration
类的全限定名)的key对应的配置类(该类上必须存在@Configuration
)放入IOC容器中;若没有该配置文件则默认扫描该注解所在类
二、属性
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
三、执行流程
- 包含@Import({AutoConfigurationImportSelector.class}),查看源码中的
String[] selectImports(AnnotationMetadata annotationMetadata)
方法就可得到该扫描的原理
- 读取spring.boot.enableautoconfiguration配置,如果没配置则返回true,如果为false则返回空数组
String[] NO_IMPORTS = new String[0]
- 如果为true则扫描所有的
classpath下META-INF/spring.factories
配置文件,将文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration
的key对应的字符串放入List<String>
中 List<String>
删除@EnableAutoConfiguration
属性exclude
、excludeName
中排除的类- 将
List<String>
转成String[]
,将String[]
中的配置类加入到IOC容器中
四、与@ComponentScan的异同
- 和@ComponentScan类似都是扫描带有@Component的类放入IOC容器中
- @ComponentScan注解只能扫描到指定包范围内的Bean注册到IOC容器中(包含本项目、依赖),当依赖的Bean也需要注册到IOC容器中时,若包不在扫描范围内,还需要用户自己手动配置额外的扫描包的范围,通常我们需要引入的依赖是非常多的,这就要写非常多的扫描包范围,这对于用户来说非常不友好;此时需要借助
@EnableAutoConfiguration
+META-INF/spring.factories
,这样用户引入依赖时无需关注依赖中的Bean扫描范围就会自动注册到IOC容器中;查看SpringBoot所需的依赖会发现有很多META-INF/spring.factories
就是这样实现的