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否则不会被自动识别和导入

✅ 主要区别点分析如下:

对比点MyFeatureAutoConfigurationDataSourceAutoConfiguration
? 装配控制逻辑通过配置开关(布尔型)控制是否开启通过类是否存在、是否已有 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 {}
posted @ 2025-08-19 10:15  yjbjingcha  阅读(54)  评论(0)    收藏  举报