自动配置原理入门
-
引导加载自动配置类
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters ={@Filter(type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}), @Filter(type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})}) public @interface SpringBootApplication {}
-
@SpringBootConfiguration
代表当前是一个配置类
-
@ComponentScan
指定要扫描哪些,Spring注解;
-
@EnableAutoConfiguration
@AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {}
-
@AutoConfigurationPackage
自动配置包
@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件 public @interface AutoConfigurationPackage {} //利用Registrar给容器中导入一系列组件 //将指定的一个包下的所有组件导入进来,MainApplication所在的包下
-
@Import(AutoConfigurationImportSelector.class)
1、利用getAutoConfigurationEntry(annotationMetadata)方法,给容器中批量导入一些组件 2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类 3、利用工厂加载Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader),得到所有的组件 4、从META-INF/spring.factories位置来加载一个文件 默认扫描我们当前系统里面所有的META-INF/spring.factories位置的文件 spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
文件里面写死了Spring-boot一启动就要给容器中加载的所有配置类
2、按需开启自动配置项
- 虽然在项目中所涉及到的场景的所有自动配置启动的时候默认全部加载,但是按照条件装配规则(@Conditional),最终会按需配置
3、修改默认配置
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的配置优先
@Bean @ConditionalOnMissingBean public CharacterEncodingFilter characterEncodingFilter(){}
总结:
-
SpringBoot先加载所有的自动配置类
-
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值
-
生效的配置就会给容器中配置很多组件
-
只要容器中有这些组件,相当于这些功能就有了
-
定制化配置
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改
-
只要用户有自己的配置,就用用户的配置
xxxAutoConfiguration------>组件------>xxxxProperties里面拿值------>application.properties
4、最佳实践
- 引入场景依赖
- spring-boot-starter
- 查看自动配置了哪些
- 是否需要修改
- 参照文档修改配置项
- 自定义加入或者替换组件
- …
-
-