这是 SpringBoot3 第五篇视频笔记,本篇深入记录 SpringBoot 自动配置原理。


自动配置流程

    1. 导入相关的场景化依赖包
    • 场景启动器会自动导入相关场景的所有依赖
    • 每个场景启动器都引入了一个spring-boot-starter这个核心场景启动器
    • 核心场景启动器引入了spring-boot-autoconfigure
    • spring-boot-autoconfigure包中包含了所有场景的所有配置
    • 只要这个包下面的所有类都生效,那么相当于导入的场景官方整合就生效了
    • 但是 SpringBoot 默认是不能扫描到spring-boot-autoconfigure这个包下面的所有配置类的
    1. 主启动程序配置
    • 使用@SpringBootApplication将类标记为 SpringBoot 应用的启动类
    • 这个注解由三个注解组成 - @SpringBootConfiguration 标记这个类是一个配置类 - @EnableAutoConfiguration 开启自动配置功能 - @ComponentScan 扫描包位置
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {}
    1. @EnableAutoConfiguration这个注解是 SpringBoot 开启自动配置的核心注解
    • 这个注解的核心由@Import({AutoConfigurationImportSelector.class})提供,批量给容器中导入组件(演示代码 5-1)
    • SpringBoot3.1.2版本下,SpringBoot 启动会默认加载 146 个配置类
    • 这个一百多个配置类来自于spring-boot-autoconfigure包下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的 (演示代码 5-2)
    • 项目启动的时候会通过@Import注解去导入spring-boot-autoconfigure包下的所有AutoConfiguration标注的自动配置类,这些类的名字都有统一的规范xxxAutoConfiguration

演示代码 5-1

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {}

演示代码 5-2

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).getCandidates();
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.");
    return configurations;
}
    1. 按需生效
    • 虽然这些自动配置类已经全部导入到了容器中,但是并不是所有的配置类都会生效
    • 配置类中都包含有条件注解@ConditionOnxxx,只有条件成立了,配置类才会生效
    1. xxxAutoConfiguration 自动配置类的作用
    • 给容器中使用@Bean放一堆组件
    • 每个自动配置类都可能有@EnableConfigurationProperties注解,用来把配置文件中指定前缀的属性值绑定到xxxProperties属性类中
    • 只需要修改配置文件的值,核心组件的底层参数就会被修改