在 Spring 框架中,@Configuration
是一个核心注解,用于定义 Spring 的配置类,相当于传统 XML 配置的 Java 替代方案。它的作用可以用“Spring 的组装说明书”来理解:
1. 核心作用
@Configuration
标注的类告诉 Spring:
“这个类是用来定义 Bean 的,请按我的描述组装应用”。
它通常与 @Bean
注解配合使用,替代 XML 配置,实现纯 Java 的依赖注入。
2. 关键特性
特性 | 说明 |
---|---|
替代 XML | 用 Java 代码代替 <bean> 标签,更灵活、类型安全。 |
单例管理 | 默认 @Bean 方法返回的对象是单例(Spring 容器只创建一次)。 |
依赖注入 | 可以直接调用其他 @Bean 方法,Spring 会自动处理依赖。 |
组件扫描 | 配合 @ComponentScan 自动发现并注册其他组件(如 @Service )。 |
3. 基础用法示例
@Configuration // 声明这是一个配置类
public class AppConfig {
@Bean // 定义一个 Bean,方法名默认作为 Bean 的名称
public DataSource dataSource() {
return new HikariDataSource(); // 返回一个数据库连接池实例
}
@Bean
public UserService userService() {
// 直接调用 dataSource() 方法,Spring 会自动注入
return new UserService(dataSource());
}
}
等效的 XML 配置(对比理解):
<beans>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"/>
<bean id="userService" class="com.example.UserService">
<constructor-arg ref="dataSource"/>
</bean>
</beans>
4. 高级用法
(1) 条件化加载 Bean(@Conditional
)
@Bean
@ConditionalOnClass(DataSource.class) // 只有当 DataSource 类存在时才生效
public DataSource dataSource() {
return new HikariDataSource();
}
(2) 外部配置绑定(@ConfigurationProperties
)
@Configuration
@ConfigurationProperties(prefix = "app") // 绑定 application.properties 中的配置
public class AppConfig {
private String name;
private int version;
// Getter/Setter 省略...
}
application.properties
:
app.name=MyApp
app.version=1
(3) 代理模式(默认 CGLIB 增强)
@Configuration
类会被 Spring 动态代理,确保多次调用 @Bean
方法返回同一个实例(单例)。
5. 常见问题
Q1: @Configuration
和 @Component
有什么区别?
注解 | 用途 |
---|---|
@Configuration | 明确声明为配置类,@Bean 方法会被代理以保证单例。 |
@Component | 通用组件注解,如果用在 @Bean 方法上,每次调用会创建新实例(除非手动处理单例)。 |
Q2: 为什么 Spring Boot 不需要大量 @Configuration
?
Spring Boot 的自动配置(Auto-Configuration)已经通过 META-INF/spring.factories
预定义了常用组件的 @Configuration
类(如 DataSourceAutoConfiguration
),开发者只需通过 application.properties
调整参数即可。
6. 总结
- 何时用:
需要自定义 Bean 的创建逻辑(如第三方库集成、复杂依赖)时使用。 - 优势:
- 比 XML 更灵活(可编程、IDE 友好)。
- 与 Java 代码无缝集成(如条件判断、循环)。
- 一句话:
@Configuration
是 Spring 的“中央工厂”,用 Java 代码指挥 Spring 如何组装对象!
如果结合 @Bean
、@ComponentScan
和 @Import
使用,能实现更强大的配置功能。