@Bean是Spring手动注册第三方Bean的标准方式,需配合@Configuration使用,支持无参/带参注册、作用域控制、生命周期管理及条件化注册。

@Bean 注解是 Spring 中手动注册第三方 Bean 的标准方式,适用于无法修改源码、不能加 @Component 的类(比如 DruidDataSource、ObjectMapper、SAXReader 等)。它不依赖类上注解,而是通过方法返回值 + 配置类来完成注册。
必须配合 @Configuration 使用
只有在被 @Configuration 标记的类中,@Bean 方法才会被 Spring 容器识别并处理。普通工具类或启动类里加 @Bean 无效。
- 配置类需显式启用:要么被 @ComponentScan 扫描到,要么通过 new AnnotationConfigApplicationContext(AppConfig.class) 显式加载
- 方法必须是非静态的(Spring 会代理该方法以保证单例行为)
注册一个无参第三方 Bean
最常见场景:直接 new 出对象并返回,例如 Druid 数据源:
@Configuration
public class JdbcConfig {
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUsername("root");
ds.setPassword("123456");
return ds;
}
}
- Bean 名称默认为方法名(如 dataSource)
- 可手动指定名称:
@Bean("myDataSource") - 该 Bean 默认作用域为 singleton,多次注入/获取得到的是同一个实例
注册带参或依赖其他 Bean 的第三方 Bean
@Bean 方法参数支持自动注入——Spring 会从容器中查找匹配类型的 Bean 并传入:
立即学习“Java免费学习笔记(深入)”;
@Configuration
public class OSSConfig {
@Bean
public AliyunOSSProperties ossProperties() {
return new AliyunOSSProperties("oss-cn-hangzhou.aliyuncs.com", "AK");
}
@Bean
public AliyunOSSOperator ossOperator(AliyunOSSProperties properties) {
return new AliyunOSSOperator(properties); // 构造器依赖已自动注入
}
}
- 无需手动 getBean,Spring 在调用 ossOperator() 前已准备好 ossProperties()
- 适合封装复杂初始化逻辑(如设置超时、添加拦截器、绑定配置等)
- 若依赖尚未注册,编译不报错但启动时报 NoSuchBeanDefinitionException
进阶控制:作用域、生命周期与条件化
可通过属性进一步定制 Bean 行为:
- 指定作用域:
@Bean @Scope("prototype")(每次注入都新建实例) - 声明初始化/销毁方法:
@Bean(initMethod = "init", destroyMethod = "close"),对应类中需有无参 public 方法 - 按条件注册:
@Bean @ConditionalOnMissingBean(DataSource.class),避免重复注册 - 按环境启用:
@Bean @Profile("dev")
不复杂但容易忽略


















