@configuration是spring核心注解,用于标识配置类以替代xml,通过@bean方法声明bean并纳入ioc容器管理;其类被cglib代理保障单例复用,支持@import组合配置、依赖注入及作用域控制。

在 Spring 中,@Configuration 是一个核心注解,用于标识一个类是配置类,替代传统的 XML 配置文件。它配合 @Bean 方法,可以声明和定制 Bean 的创建逻辑。
@Configuration 类的作用与基本写法
@Configuration 标记的类会被 Spring 容器识别为配置源,其中所有用 @Bean 注解的方法都会被容器调用,返回的对象作为 Bean 注册进 IoC 容器。该类本身也会作为一个特殊的 Bean(类型为 ConfigurationClassPostProcessor 处理后的代理对象)。
注意:配置类默认是单例的,且推荐使用 public 类 + public 的 @Bean 方法。
示例:
<font color="#888"><pre class="brush:php;toolbar:false;">@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl();
}
}
@Bean 方法的关键细节
@Bean 方法本质是工厂方法,Spring 会拦截其调用以实现依赖注入、作用域控制等能力。不是简单地 new 对象然后返回,而是纳入 Spring 生命周期管理。
- 方法名默认作为 Bean 名称;也可用
@Bean("customName")指定 - 可添加
@Scope("prototype")控制作用域,默认 singleton - 支持方法参数自动注入其他 Bean(Spring 自动解析依赖)
- 支持
@Primary、@Qualifier等限定行为
例如:
<font color="#888"><pre class="brush:php;toolbar:false;">@Bean
@Scope("prototype")
public EmailService emailService(EmailConfig config) {
return new EmailServiceImpl(config);
}
配置类之间的依赖与导入
多个配置类可通过 @Import 组合,类似 XML 中的 <import></import>。被导入的配置类无需额外标注 @Configuration(但建议加),也能被处理。
-
@Import({DbConfig.class, CacheConfig.class})直接引入其他配置类 - 支持导入普通类(无
@Configuration),其内部@Bean方法仍有效 - 也支持导入
ImportSelector或ImportBeanDefinitionRegistrar实现动态注册
常见用法:
<font color="#888"><pre class="brush:php;toolbar:false;">@Configuration
@Import({DataSourceConfig.class, RedisConfig.class})
public class AppConfig { }
与 @Component 的区别与选择
@Configuration 是 @Component 的派生注解,但二者语义和行为不同:
-
@Component类中的@Bean方法不会被 CGLIB 增强,无法保证单例复用(多次调用会 new 多次) -
@Configuration类会被 CGLIB 代理,同一配置类内多次调用@Bean方法仍返回同一个实例(保障 singleton 行为) - 纯 Bean 定义推荐用
@Configuration;若只是零散组件,用@Component更轻量
不推荐混用:避免在 @Component 类中写大量 @Bean 方法,容易引发意外行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











