SpringBoot 的自动配置原理

5 阅读3分钟

一、自动配置的核心思想

SpringBoot 自动配置的本质是:基于类路径下的依赖、配置文件等条件,自动向 Spring 容器中注册符合条件的 Bean,从而省去手动配置 XML 或 JavaConfig 的过程

简单来说,就是 SpringBoot 会 “猜” 你需要什么配置,然后自动帮你配好,你只需要少量配置甚至零配置就能运行项目。

二、自动配置的核心实现步骤(由浅入深)

1. 入口:@SpringBootApplication 注解

所有 SpringBoot 项目的启动类都标注了 @SpringBootApplication,这个注解是一个 “组合注解”,核心依赖以下三个注解实现自动配置:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration // 本质是@Configuration,标记当前类为配置类
@EnableAutoConfiguration // 开启自动配置的核心注解
@ComponentScan // 扫描当前包及子包的组件
public @interface SpringBootApplication {
    // 省略其他属性
}

其中 @EnableAutoConfiguration 是自动配置的 “开关”。

2. @EnableAutoConfiguration 的底层逻辑

@EnableAutoConfiguration 又依赖两个关键类:

  • AutoConfigurationImportSelector:核心作用是加载所有符合条件的自动配置类
  • SpringFactoriesLoader:从类路径下的 META-INF/spring.factories 文件中读取配置的自动配置类全限定名。

核心流程

graph TD
    A[启动类@SpringBootApplication] --> B[@EnableAutoConfiguration]
    B --> C[AutoConfigurationImportSelector]
    C --> D[SpringFactoriesLoader]
    D --> E[读取META-INF/spring.factories]
    E --> F[加载所有自动配置类(如DataSourceAutoConfiguration)]
    F --> G[根据条件判断是否生效]
    G --> H[向容器注册Bean]

3. 自动配置类的条件判断(@Conditional 系列注解)

加载的自动配置类(如 DataSourceAutoConfigurationWebMvcAutoConfiguration)并非全部生效,而是通过 @Conditional 系列注解做 “条件过滤”,只有满足条件才会生效。

常见的条件注解:

表格

注解作用
@ConditionalOnClass类路径下存在指定类时生效
@ConditionalOnMissingClass类路径下不存在指定类时生效
@ConditionalOnBean容器中存在指定 Bean 时生效
@ConditionalOnMissingBean容器中不存在指定 Bean 时生效
@ConditionalOnProperty配置文件中存在指定属性时生效
@ConditionalOnWebApplication当前是 Web 应用时生效

示例:以 DataSourceAutoConfiguration 为例(简化版)

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}) // 存在数据源相关类才生效
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory") // 不存在R2DBC连接工厂才生效
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置文件中的数据源属性
public class DataSourceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean // 容器中没有数据源Bean时才注册
    public DataSource dataSource(DataSourceProperties properties) {
        // 根据配置文件中的属性(如spring.datasource.url)创建数据源Bean
        return properties.initializeDataSourceBuilder().build();
    }
}

4. 配置属性绑定(@ConfigurationProperties)

自动配置类会通过 @EnableConfigurationProperties 绑定 application.properties/yaml 中的配置,比如:

  • DataSourceProperties 绑定 spring.datasource.* 配置
  • ServerProperties 绑定 server.port 等配置

这意味着你可以通过修改配置文件,覆盖自动配置的默认值(比如把默认端口 8080 改成 8888)。

5. 自动配置的优先级

SpringBoot 保证用户自定义配置 > 自动配置

  • 如果你手动注册了某个 Bean(比如自己写了 @Bean DataSource),自动配置的同名 Bean 会失效(因为 @ConditionalOnMissingBean);
  • 配置文件中的属性会覆盖自动配置的默认值。

三、实战验证(如何查看生效的自动配置)

你可以在启动类中添加日志配置,查看哪些自动配置生效 / 失效:

# application.properties
debug=true

启动项目后,控制台会输出 Positive matches(生效的自动配置)和 Negative matches(未生效的自动配置),比如:

============================
CONDITIONS EVALUATION REPORT
============================

Positive matches:
-----------------
   DataSourceAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
      - @ConditionalOnMissingBean (types: io.r2dbc.spi.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

Negative matches:
-----------------
   WebSocketAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class 'javax.websocket.server.ServerContainer' (OnClassCondition)

总结

  1. 核心入口@SpringBootApplication 中的 @EnableAutoConfiguration 是自动配置的开关;
  2. 加载机制:通过 SpringFactoriesLoader 读取 META-INF/spring.factories 中的自动配置类,再通过 @Conditional 系列注解筛选生效的配置;
  3. 灵活定制:用户可通过自定义 Bean、修改配置文件覆盖自动配置,保证 “约定优于配置” 的同时兼顾灵活性。

简单来说,SpringBoot 自动配置就是 “基于条件的自动注册 Bean + 配置属性绑定”,既简化了配置,又保留了自定义的空间。