day3 springboot 自动配置原理
1. 引导加载自动配置类
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
),
@Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)
}
)
public @interface SpringBootApplication {}
// 上方为注解的部分内容
@SpringBootApplication
@SpringBootConfiguration:代表当前是一个配置类
@ComponentScan:指定要扫描哪些
@EnableAutoConfiguration
// @EnableAutoConfiguration 内容
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {}
@AutoConfigurationPackage:自动配置包
// @AutoConfigurationPackage 部分内容
@Import({AutoConfigurationPackages.Registrar.class})
public @interface AutoConfigurationPackage {}
//利用 Registrar 给容器中导入一系列组件
// 将指定的一个包下的所有组件导入进来,MainApplication 所在的包下
@Import({AutoConfigurationImportSelector.class})
// 部分内容
AutoConfigurationImportSelector{} -> selectImports() -> getAutoConfigurationEntry(annotationMetadata)
1. 利用 `getAutoConfigurationEntry(annotationMetadata)` 给容器中批量导入组件
2. 调用 `List<String> configuration = getCandidateConfigurations(annotationMetadata,attributes)` 获取到所有需要导入到容器中的配置类
3. 利用工厂加载 `Map<String,List<String>> loadSpringFactories(@Nullable ClassLoader classLoader)`,得到所有的组件
-
从 META-INF/spring-factories 位置来加载一个文件
默认扫描我们系统里面所有 META-INF/spring-factories 位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar 包里也有 META-INFO/spring.factories
-
文件内写死了 springboot 一启动就要给容器中加载的所有配置类。
2. 按需开启自动配置项目
虽然我们大量场景下的所有自动配置在启动的时候默认全部加载
按照条件装配规则,最终会按需配置
使用 @ConditionalOnClass 注解,在符合条件的情况下按需加载。
3. 总结
- springboot 先加载所有的自动配置类:xxxxAutoConfiguration
- 每个自动配置类按照条件生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿,xxxxProperties 和配置文件进行了绑定。
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能都有了
- 只要用户有自己配置的,就以用户的为准
- 定制化配置
- 用户直接自己使用 @Bean 替换底层的组件
- 用户去看这个组件是获取的配置文件什么值,去修改即可。
xxxxAutoConfiguration -> 组件 -> xxxxProperties里拿值 -> application.properties