Bean@AutoConfiguration // ? Spring Boot 3.x 推荐用法,替代 @Configuration@Bean?是 Spring Boot 3 新增的注解,用来标记自动配置类(等价于注册)。 - 详解
Spring Boot 的自动装配流程(Auto Configuration)是其最核心的特性之一,它使得开发者无需手动配置大量 XML 或 Java 配置类即可快速启动项目。
一、Spring Boot 自动装配的本质
自动装配的核心是:根据项目中引入的依赖(Spring Boot 的Starter或者你自定义的Starter)、当前应用环境和类路径中的内容(你的application.yml文件中的内容),自动注册合适的 Bean 到 Spring 容器中。
二、Spring Boot 启动过程中的自动装配流程
启动类和 @SpringBootApplication
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
@SpringBootApplication 是一个组合注解,包含:
@Target(...)
@Retention(...)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration // ⭐ 自动装配的核心注解
@ComponentScan
public @interface SpringBootApplication {
...
}
所以自动装配的核心是 @EnableAutoConfiguration 注解。
@EnableAutoConfiguration 注解
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
? 核心点:通过 @Import(AutoConfigurationImportSelector.class) 引入了一个类,这个类负责加载自动配置类。
AutoConfigurationImportSelecto
当主项目依赖你的 starter 后,Spring Boot 会自动执行以下过程:
| 步骤 | Spring Boot 做了什么 |
|---|---|
| 1️⃣ | 在启动过程中执行 AutoConfigurationImportSelector |
| 2️⃣ | 自动读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |
| 3️⃣ | 加载所有在文件中声明的配置类(如你的 MyFeatureAutoConfiguration) |
| 4️⃣ | 检查配置类是否标注了 @AutoConfiguration 或 @Configuration |
| 5️⃣ | 运行条件注解(如 @ConditionalOnProperty)判断是否生效 |
| 6️⃣ | 满足条件 → 注册对应的 @Bean 到 Spring 容器 |
三、自定义自动配置类
简单开关型
@Configuration
@ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
public class MyFeatureAutoConfiguration {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
复杂条件型
@Configuration
@ConditionalOnClass(DataSource.class) // 类路径中有这个类才生效
@ConditionalOnMissingBean(DataSource.class) // 如果没有手动定义 DataSource
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Bean
public DataSource dataSource(DataSourceProperties props) {
// 创建并返回 DataSource
}
}
@Configuration 和 @EnableConfigurationProperties 是必备,剩下的注解是用来定义这个配置类才什么情况下才会自动装配。
| 注解 | 作用 |
|---|---|
@ConditionalOnClass | 当类路径中存在某个类时生效 |
@ConditionalOnMissingBean | 当容器中不存在某个 Bean 时生效 |
@ConditionalOnProperty | 当某个配置属性满足条件时生效 |
@ConditionalOnBean | 当容器中存在某个 Bean 时生效 |
@ConditionalOnWebApplication | 当前是 Web 应用时生效 |
@ConditionalOnExpression | 表达式为 true 时生效 |
二者对比
✅ 本质相同点:
| 方面 | 内容 |
|---|---|
都是 @Configuration 配置类 | 会被 Spring Boot 加载作为自动装配类 |
都可通过 @ConditionalXxx 控制是否生效 | 控制自动装配逻辑的“条件成立才注册” |
都需要在 Spring Boot 3 中写入 AutoConfiguration.imports | 否则不会被自动识别和导入 |
✅ 主要区别点分析如下:
| 对比点 | MyFeatureAutoConfiguration | DataSourceAutoConfiguration |
|---|---|---|
| ? 装配控制逻辑 | 通过配置开关(布尔型)控制是否开启 | 通过类是否存在、是否已有 Bean 等组合条件判断是否生效 |
| ? 自动化程度 | 手动开关,开发者自己开启功能 | 更智能:自动判断是否应该装配 |
| ? 依赖的注解 | 只用了 @ConditionalOnProperty | 用了多个复杂条件注解(适应多种场景) |
| ? 支持配置属性绑定 | ❌ 没有配置属性注入 | ✅ 使用了 @EnableConfigurationProperties 自动绑定配置 |
| ? 用途 | 适合新功能、特性模块(用户开关) | 适合核心设施(例如数据库、缓存等自动识别) |
| ? 冲突处理 | 不考虑与已有 Bean 冲突 | 显式避免与手动定义 Bean 冲突:@ConditionalOnMissingBean |
场景对比
| 场景 | 使用哪种方式更合适? |
|---|---|
| 给 starter 加一个可选功能模块(如短信验证码) | ✅ 用 @ConditionalOnProperty |
| 给用户提供默认 DataSource,但允许用户自定义 | ✅ 用 @ConditionalOnClass + @ConditionalOnMissingBean |
| Redis 自动配置类(要保证有 Redis 类 + 没有自定义 Bean) | ✅ 用组合型注解控制 |
| 启用一个新 API 接口模块 | ✅ 用配置项开关控制更好 |
四、自定义自动装配类的完整步骤
Step 1:编写自动配置类
package com.example.autoconfig;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
@AutoConfiguration // ? Spring Boot 3.x 推荐用法,替代 @Configuration
@ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true", matchIfMissing = false)
public class MyFeatureAutoConfiguration {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
?
@AutoConfiguration是 Spring Boot 3 新增的注解,用来标记自动配置类(等价于@Configuration + spring.factories注册)。
Step 2:注册自动配置类
在 resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中添加你的自动配置类:
com.example.autoconfig.MyFeatureAutoConfiguration
? 注意文件路径:必须是
my-feature-starter/
├── src/
│ ├── main/
│ │ ├── java/com/example/autoconfig/
│ │ │ └── MyFeatureAutoConfiguration.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── spring/
│ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
Step 3:使用方引入依赖并使用该自动配置类
com.example
my-feature-starter
使用你这个 starter 的项目只需在配置文件启用:
my.feature.enabled=true
Spring Boot 会自动扫描你注册的 AutoConfiguration.imports 文件,并自动装配你的 MyService Bean。
五、如何查看自动装配了哪些内容?
方法一:开启调试日志
在 application.properties 中加入:
debug=true
启动时会输出 ConditionEvaluationReport,列出哪些自动配置类生效了,哪些没有生效以及原因。
方法二:使用 spring-boot-actuator 端点
org.springframework.boot
spring-boot-starter-actuator
开启 /actuator/conditions 端点查看自动装配情况。
六、手动排除自动配置类
你可以通过 exclude 属性排除某些自动配置:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyApp {}
浙公网安备 33010602011771号