自动包规则原理
1.@SpringBootConfiguration
@Configuration.代表当前是一个配置类
2.@ConponentScan
指定扫描哪些,Spring注解
3.@EnableAutoConfiguration
初始加载自动配置类
1.利用getAutoConfigurationEnty(annotationMetadata);给容器中批量导入一些组件
2.调用
list<String>configurations=getCandidateConfigurations(annotationMetadata,attributes)
获取到所有需要导入到容器中的配置类。
3.利用工厂加载
Map<String,List<String><>loadSpringFactories(@Nullable ClassLoader classLoader)
得到所有的组件
4.从META-INF/spring.factories位置的文件spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
springBoot的全场景自动配置:
文件里面写死了spring.boot-启动就要给容器中加载的所有配置类
虽然我们启动的时候加载了这么多场景的自动配置,但是哪些生效哪些不生效还是要进行选择(并非所有的自动配置都生效),最终按照条件配置规则,按需装配。(得益于@Conditional这个注解)
自动配置流程
我们发现这个类在我们spring的核心包中,所以满足条件
查看我们容器发现,没有这个组件,因此下面的代码不会再执行
这样做的原因是矫正bean的名字,以便于容器的管理,同时增强了代码的健壮性
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先。
总结:
- SpringBoot先加载所有的自动配置类xxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxProperties里面拿,xxxProperties和配置文件进行了绑定。
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改