Skip to content

SpringBoot自动配置机制

SpringBoot自动配置的内容有: 相关模块的集成配置,包扫描规则, 常见属性的默认值。

1. 自动集成Tomcat、SpringMVC等

以前项目中整合Web,Tomcat需要一系列的配置,比如DispatcherServlet、ViewResolver、CharacterEncodingFilter...
现在使用SpringBoot就已经默认配置好了,下面代码验证SpringBoot的容器中是否有这些Bean对象:

java
public static void main(String[] args) {

    //java10: 局部变量类型的自动推断
    var ioc = SpringApplication.run(MainApplication.class, args);

    //1、获取容器中所有组件的名字
    String[] names = ioc.getBeanDefinitionNames();
    //2、挨个遍历:
    // dispatcherServlet、beanNameViewResolver、characterEncodingFilter、multipartResolver
    // SpringBoot把以前配置的核心组件现在都给我们自动配置好了。
    for (String name : names) {
        System.out.println(name);
    }
}

2. 默认的包扫描规则

SpringBoot默认会扫描主程序所在的目录及其下面的子包,其中主程序为@SpringBootApplication注解的启动类。
自定义扫描路径有两种:

  1. @SpringBootApplication注解中使用scanBasePackages属性,指定扫描的路径即可。
  2. 使用@ComponentScan注解中使用basePackages属性,指定扫描的路径即可。

3. 配置默认值

配置文件的所有配置项是和某个类的对象值进行一一绑定的,绑定了配置文件中每一项值的类称为属性类。 比如:

  • ServerProperties绑定了所有Tomcat服务器有关的配置
  • MultipartProperties绑定了所有文件上传相关的配置
    如需修改属性配置具体项,可以参照官方文档 或者参照源码SpringBoot绑定的属性类。

4. 按需加载自动配置

原理: SpringBoot的starter包引入都会默认引入spring-boot-starter, 它是所有starter的starter,基础核心starter。spring-boot-starter会引入一个包spring-boot-autoconfigure, spring-boot-autoconfigure里面都是各种场景的AutoConfiguration自动配置类。
虽然全场景的自动配置都在spring-boot-autoconfigure这个包,但是不是全都开启的。导入哪个starter包就开启哪个自动配置。 Alt text

总结

导入某个starter包就会触发spring-boot-autoconfigure对应这个包的相关自动配置生效, SpringBoot中就会具有相关的功能

5. 自动配置流程

自动配置流程图 自动配置流程细节梳理:

  1. 当导入starter-web依赖:也就是导入了web-starter包
    • web-starter包导入了相关场景的所有依赖:starter-json、starter-tomcat、springmvc
    • 每个starter都引入了一个spring-boot-starter,核心场景starter。
    • 核心starter引入了spring-boot-autoconfigure包。
    • spring-boot-autoconfigure里面囊括了所有场景的所有配置。
    • 只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了。
    • SpringBoot默认却扫描不到spring-boot-autoconfigure下写好的所有配置类。(这些配置类给我们做了整合操作),默认只扫描主程序所在的包。
  2. 主程序:@SpringBootApplication
    • @SpringBootApplication由三个注解组成:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
    • SpringBoot默认只能扫描自己主程序所在的包及其下面的子包,扫描不到 spring-boot-autoconfigure包中官方写好的配置类
    • @EnableAutoConfiguration:是SpringBoot能够开启自动配置的核心。
      a. 底层是由@Import(AutoConfigurationImportSelector.class)提供功能:批量给容器中导入组件。
      b. SpringBoot启动会默认加载146个配置类。
      b. 这146个配置类来自于spring-boot-autoconfigureMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的
    • 项目启动的时候利用@Import批量导入组件机制把autoconfigure包下的146xxxxAutoConfiguration类导入进来(自动配置类)
    • 虽然导入了146个自动配置类, 按需生效:
      a. 并不是这146个自动配置类都能生效
      b. 每一个自动配置类,都有条件注解@ConditionalOnxxx,只有条件成立,才能生效
  3. xxxxAutoConfiguration自动配置类
    • 给容器中使用@Bean 放一堆组件。
    • 每个自动配置类都可能有这个注解@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中配的指定前缀的属性值封装到xxxProperties属性类中, 以Tomcat为例:把服务器的所有配置都是以server开头的。配置都封装到了属性类中。
    • 给容器中放的所有组件的一些核心参数,都来自于xxxProperties。xxxProperties都是和配置文件绑定。
    • 只需要改配置文件的值,核心组件的底层参数都能修改
  4. 写业务,全程无需关心各种整合(底层这些整合写好了,而且也生效了) SpringBoot启动dubug, 可以看到备选的配置类有146个: Alt text