后宫心计
111.02M · 2026-03-07
SpringBoot 自动配置的本质是:基于类路径下的依赖、配置文件等条件,自动向 Spring 容器中注册符合条件的 Bean,从而省去手动配置 XML 或 JavaConfig 的过程。
简单来说,就是 SpringBoot 会 “猜” 你需要什么配置,然后自动帮你配好,你只需要少量配置甚至零配置就能运行项目。
所有 SpringBoot 项目的启动类都标注了 @SpringBootApplication,这个注解是一个 “组合注解”,核心依赖以下三个注解实现自动配置:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration // 本质是@Configuration,标记当前类为配置类
@EnableAutoConfiguration // 开启自动配置的核心注解
@ComponentScan // 扫描当前包及子包的组件
public @interface SpringBootApplication {
// 省略其他属性
}
其中 @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]
加载的自动配置类(如 DataSourceAutoConfiguration、WebMvcAutoConfiguration)并非全部生效,而是通过 @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();
}
}
自动配置类会通过 @EnableConfigurationProperties 绑定 application.properties/yaml 中的配置,比如:
DataSourceProperties 绑定 spring.datasource.* 配置ServerProperties 绑定 server.port 等配置这意味着你可以通过修改配置文件,覆盖自动配置的默认值(比如把默认端口 8080 改成 8888)。
SpringBoot 保证用户自定义配置 > 自动配置:
@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)
@SpringBootApplication 中的 @EnableAutoConfiguration 是自动配置的开关;SpringFactoriesLoader 读取 META-INF/spring.factories 中的自动配置类,再通过 @Conditional 系列注解筛选生效的配置;简单来说,SpringBoot 自动配置就是 “基于条件的自动注册 Bean + 配置属性绑定”,既简化了配置,又保留了自定义的空间。