1. 引导加载自动配置类
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} )
1. @SpringBootConfiguration
当前这个类是一个配置类
2. @ComponentScan
指定扫描哪些类
3. @EnableAutoConfiguration
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration {}
-
@AutoConfigurationPackage
自动配置包
@Import({Registrar.class}) // 给容器中导入一个组件 public @interface AtuoConfigurationPackage {} // 利用Registrar 给容器中导入一系列组件 // 将指定一个包下的所有组件导入进来?主启动类 所在包下
这个方法会扫描当前包下所有的类,注册到容器中,由于@SpringApplication内有这个注解,所以现在扫描的也就是主启动类所在的。
-
@Import({AutoConfigurationImportSelector.class})
1. 利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件 2. 调用List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取到所有需要导入到容器中的bean 3. 利用工厂加载 private static Map<String, List<String>> loadSpringFactories(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 一启动就要给容器容器中加载的所有配置类 按照条件装配规则(@Conditional),最终会按需配置
SpringBoot默认会在底层配置好所有的组件,但是如果用户配置了会以用户的优先。
总结:
-
SpringBoot先加载所有的自动配置类。xxxxAutoConfiguration
-
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。从xxxxProperties类中拿,xxxxProperties和配置文件进行了绑定
-
生效的配置类就会给容器中装配很多的组件
-
只要容器中有这些组件,相当于这些功能就有了
-
只要用户有自己配置的,就以用户的优先
-
定制化配置:
-
用户自己使用@Bean替换底层的组件
-
用户去看这个组件获取的配置值是什么,在properties文件中进行修改
-
xxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties