Spring Boot自动配置原理

Spring Boot 自动配置原理深度拆解(2025 最新最全版)

这篇文章让你彻底搞懂 Spring Boot 为什么“开箱即用”,也是大厂面试必问的核心点之一。

一、核心结论一句话(面试直接说)

Spring Boot 的自动配置本质是:在启动时根据类路径下的 jar 包,结合 @Conditional 系列注解,决定是否加载某些 @Configuration 配置类,从而实现“约定优于配置”的魔法

二、自动配置完整执行流程(源码级)

1. 启动入口:SpringApplication.run(DemoApplication.class, args)

2. 创建 SpringApplication 对象
   └─ 推断应用类型(SERVLET / REACTIVE)
   └─ 加载 META-INF/spring.factories 中的 ApplicationContextInitializer 和 ApplicationListener

3. run() 方法执行
   └─ prepareContext():准备上下文
       └─ load():把启动类(DemoApplication)作为 BeanDefinition 加载进容器
       └─ applyInitializers():执行所有 Initializer(最关键的是 ConfigurationClassPostProcessor)

4. refreshContext() → 真正启动容器
   └─ invokeBeanFactoryPostProcessors()
       └─ ConfigurationClassPostProcessor 登场(Spring 框架最牛的类之一)

5. ConfigurationClassPostProcessor 干了什么?
   └─ 解析 @SpringBootApplication 上的 @EnableAutoConfiguration
   └─ 读取所有 META-INF/spring.factories 中的
       org.springframework.boot.autoconfigure.EnableAutoConfiguration = xxxAutoConfiguration

6. 开始加载成百上千的 XxxAutoConfiguration 类
   └─ 每个 XxxAutoConfiguration 都标注了:
       @ConditionalOnClass
       @ConditionalOnMissingBean
       @ConditionalOnProperty
       @ConditionalOnWebApplication
       ...
   └─ 只有条件都满足,才会真正把里面的 @Bean 注册到容器

7. 最终效果:你引入 spring-boot-starter-web → 自动有了 Tomcat + DispatcherServlet + Jackson + ...

三、核心注解一览表(背会这 8 个就通关)

注解作用位置含义
@SpringBootApplication启动类复合注解 = @Configuration + @EnableAutoConfiguration + @ComponentScan
@EnableAutoConfiguration启动类开启自动配置(最核心)
@AutoConfigurationPackage启动类把启动类所在包及其子包作为组件扫描根路径
@Import(AutoConfigurationImportSelector.class)EnableAutoConfiguration 上真正干活的:加载 spring.factories 中的配置类
@ConditionalOnClassXxxAutoConfiguration 上类路径下存在某个 class 才生效
@ConditionalOnMissingBean@Bean 方法上容器中没有这个类型的 Bean 才创建(用户可覆盖)
@ConditionalOnProperty配置类或 Bean 上application.yml 有对应配置才生效
@EnableConfigurationProperties配置类上允许绑定 application.yml 中的配置属性类

四、spring.factories 到底长什么样?(真实例子)

# META-INF/spring.factories(来自 spring-boot-autoconfigure.jar)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
...

Spring Boot 3.0+ 改成了 spring-boot 3 新格式:

# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
...

五、经典自动配置类拆解(手撕源码级别)

以 DataSourceAutoConfiguration 为例(最经典):

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class })
public class DataSourceAutoConfiguration {

    @Configuration(proxyBeanMethods = false)
    @Conditional(PooledDataSourceCondition.class)  // 有 Hikari/Tomcat/DBCP2
    @ConditionalOnMissingBean(DataSource.class)
    static class PooledDataSourceConfiguration {
        @Bean
        DataSource dataSource(DataSourceProperties properties) {
            // 自动创建 HikariDataSource
    }

    @Configuration
    @ConditionalOnProperty(prefix = "spring.datasource", name = "url")
    @ConditionalOnMissingBean(DataSource.class)
    static class EmbeddedDatabaseConfiguration {  // 没配 url 就用内存数据库
    }
}

这就是为什么你不配数据库也能启动(H2),配了就自动切换 MySQL 的原因!

### 六、2025 年最新变化(Spring Boot 3.3+)

1. 自动配置文件格式变更:
   - 旧:META-INF/spring.factories
   - 新:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

2. @AutoConfiguration 取代 @Configuration(更语义化)

java
@AutoConfiguration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration { … }

3. AOT 编译支持(GraalVM Native Image)
   - 自动配置类支持提前编译,启动快 100 倍

### 七、如何自定义一个自动配置(实战)

需求:自动配置一个 HelloService,只有当类路径有 lombok 且配置了 hello.enabled=true 时生效。

java
// 1. 创建 starter 项目
my-starter/
└── src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

// 文件内容:
com.example.autoconfigure.HelloAutoConfiguration

// 2. 写配置类
@AutoConfiguration
@ConditionalOnClass(Lombok.class)
@ConditionalOnProperty(prefix = “hello”, name = “enabled”, havingValue = “true”)
@EnableConfigurationProperties(HelloProperties.class)
public class HelloAutoConfiguration {

@Bean
@ConditionalOnMissingBean
public HelloService helloService(HelloProperties properties) {
    return new HelloService(properties.getName());
}

}

// 3. 配置属性类
@ConfigurationProperties(prefix = “hello”)
public class HelloProperties {
private String name = “World”;
}

// 4. 用户只需要引入你的 jar + 配置 hello.enabled=true 就能用!

### 八、如何覆盖自动配置?(3 种方式

| 方式                    | 示例                                      | 说明                              |
|-------------------------|-------------------------------------------|-----------------------------------|
| 自己定义同类型 Bean     | 自己写一个 @Bean DataSource               | 最高优先级,会覆盖自动配置        |
| exclude 排除自动配置    | @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) | 完全不加载某个自动配置            |
| 配置属性关闭            | spring.datasource.enabled=false            | 推荐方式,最优雅                  |

### 九、查看当前项目生效的自动配置(调试神器)

yaml

application.yml

debug: true # 启动时打印自动配置报告

启动日志会输出:

Positive matches: (自动配置生效的)
DataSourceAutoConfiguration matched
RedisAutoConfiguration matched

Negative matches: (没生效的)
RabbitAutoConfiguration – @ConditionalOnClass did not find required class ‘com.rabbitmq.client.Channel’
“`

十、总结一句话口诀(面试直接甩)

Spring Boot 自动配置的原理是:
启动类上的 @EnableAutoConfiguration → 通过 @Import 加载所有 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件里声明的 XxxAutoConfiguration → 每个配置类通过 @Conditional 系列注解判断是否生效 → 条件满足就注册 @Bean 到容器 → 实现“开箱即用”!

现在你可以轻松回答任何关于 Spring Boot 自动配置的问题了!

下一步想看哪个硬核主题?

  • 手把手带你写一个企业级 starter(发布到 Maven 私服)
  • Spring Boot 3 AOT + GraalVM Native 编译全流程
  • 自动配置条件注解全家桶源码解析
  • Spring Boot 3 启动流程完整时序图
    直接说,我继续给你拆!
文章已创建 3070

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部