Spring框架中的@Configuration
注解用于定义配置类,替代传统的XML配置,允许通过Java代码来配置Spring容器。以下是详细的解释:
1. 核心作用
- 替代XML配置:
@Configuration
标注的类相当于XML配置文件,其中包含Bean的定义和依赖配置。 - 声明Bean:通过在配置类中使用
@Bean
注解的方法,可以注册Spring容器管理的Bean。
2. 基本用法
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
return new DriverManagerDataSource();
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource); // 自动注入DataSource
}
}
-
加载配置类:使用
AnnotationConfigApplicationContext
加载配置类:ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); JdbcTemplate jdbcTemplate = ctx.getBean(JdbcTemplate.class);
3. 依赖注入
- 方法参数注入:
@Bean
方法可以通过参数接收其他Bean(如dataSource
注入到jdbcTemplate
)。 - 方法调用注入:在同一个配置类中调用其他
@Bean
方法时,Spring通过CGLIB代理确保返回单例实例,避免重复创建。
4. 配置类增强(CGLIB代理)
- 单例保证:
@Configuration
类被代理,使得多次调用@Bean
方法返回同一实例。 - 对比
@Component
:在普通@Component
类中使用@Bean
(称为“lite模式”),方法直接调用会创建新实例,需手动管理依赖。
5. 组合配置
-
@Import
:引入其他配置类。@Configuration @Import({DatabaseConfig.class, SecurityConfig.class}) public class AppConfig {}
-
@ComponentScan
:自动扫描组件。@Configuration @ComponentScan("com.example") public class AppConfig {}
6. 环境与Profile
-
@Profile
:根据环境激活配置。@Configuration @Profile("dev") public class DevConfig { /* 开发环境配置 */ }
7. 最佳实践
- 单一职责:每个配置类专注于一个功能模块。
- 结合注解:灵活使用
@Profile
、@Conditional
等实现条件化配置。
总结
@Configuration
是Spring Java配置的核心,通过CGLIB代理确保Bean的单例和正确依赖注入,结合@Bean
、@Import
等注解,提供灵活且强大的配置方式,替代传统XML,提升可维护性和类型安全。