SpringBoot自动配置

161 阅读2分钟

自动包规则原理

1.@SpringBootConfiguration
@Configuration.代表当前是一个配置类

2.@ConponentScan
指定扫描哪些,Spring注解

3.@EnableAutoConfiguration

image.png

image.png

初始加载自动配置类

image.png

image.png

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

image.png
springBoot的全场景自动配置: 文件里面写死了spring.boot-启动就要给容器中加载的所有配置类

image.png 虽然我们启动的时候加载了这么多场景的自动配置,但是哪些生效哪些不生效还是要进行选择(并非所有的自动配置都生效),最终按照条件配置规则,按需装配。(得益于@Conditional这个注解)

自动配置流程

image.png

image.png

image.png

image.png

image.png 我们发现这个类在我们spring的核心包中,所以满足条件 image.png 查看我们容器发现,没有这个组件,因此下面的代码不会再执行

image.png

image.png

这样做的原因是矫正bean的名字,以便于容器的管理,同时增强了代码的健壮性
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先。

总结:

  • SpringBoot先加载所有的自动配置类xxxAutoConfiguration
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxProperties里面拿,xxxProperties和配置文件进行了绑定。
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能就有了
  • 定制化配置
    • 用户直接自己@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件什么值就去修改

image.png