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,提升可维护性和类型安全。