文章目录
- 1自动配置原理
- 1.1 @SpringBootConfiguration
- 1.2.@ComponentScan
- 1.3 @EnableAutoConfiguration
- 2 为什么不使用 @Import 直接引入自动配置类
学完这篇文章,可以了解到 SpringBoot 自动配置原理
1自动配置原理
@SpringBootConfiguration 是一个组合注解,由 @ComponentScan
、@EnableAutoConfiguration
和 @SpringBootConfiguration
组成
1.1 @SpringBootConfiguration
@SpringBootConfiguration 与普通 @Configuration 相比,唯一区别是前者要求整个 app 中只出现一次
1.2.@ComponentScan
excludeFilters - 用来在组件扫描时进行排除,也会排除自动配置类
1.3 @EnableAutoConfiguration
@EnableAutoConfiguration 也是一个组合注解,由下面注解组成:
-
@AutoConfigurationPackage – 用来记住扫描的起始包
-
@Import(AutoConfigurationImportSelector.class) 用来加载
META-INF/spring.factories
中的自动配置类,AutoConfigurationImportSelector实现 DeferredImportSelector 接口,此接口保证主配置加载完了才会去加载从属配置
2 为什么不使用 @Import 直接引入自动配置类
有两个原因:
- 让主配置类和自动配置类变成了强耦合,主配置类不应该知道有哪些从属配置
- 直接用
@Import(自动配置类.class)
,引入的配置解析优先级较高,自动配置类的解析应该在主配置没提供时作为默认配置
因此,采用了 @Import(AutoConfigurationImportSelector.class)
- 由
AutoConfigurationImportSelector.class
去读取META-INF/spring.factories
中的自动配置类,实现了弱耦合。 - 另外 AutoConfigurationImportSelector.class
实现了 DeferredImportSelector 接口,让
自动配置的解析晚于主配置的解析(主配置加载完了才会去加载从属配置)