Spring 最核心的注解@Bean本质
直接用一句话讲透本质,让你快速彻底理解

答案其实并不复杂:
这个方法本身并不是 Bean,真正成为 Bean 的,是方法执行后返回的对象!
Spring 会把这个返回对象注册到容器中统一管理。
用最通俗的话讲@Bean原理
先看这段代码:
@Configuration // 配置类
public class MesaageConfig {
// 加了 @Bean 的方法
@Bean
public MessageConverter messageConverter() {
// 1. 自己 new 对象
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
// 2. 自己配置对象
converter.setCreateMessageIds(true);
// 3. 返回对象
return converter;
}
}
Spring 看到@Bean会做什么?
Spring 会自动执行这个方法,拿到返回结果,然后:
- 把返回的对象放入 Spring 容器中
- 给这个 Bean 命名,一般默认就是方法名 messageConverter
- 后续其他地方想使用时,直接注入即可
总结一下:
@Bean = 告诉 Spring:执行当前方法,并把返回的对象当作 Bean 交给容器管理!
- 方法 = 创建 Bean 的工厂方法
- 返回值 = 真正被管理的 Bean
问:它不是方法吗?怎么成 Bean 了?
画个等号你马上就明白了:
@Bean
public 消息 造消息的方法() {
造一个消息...
return 消息; // Spring 拿走这个「消息」当 Bean
}
- 方法:只是生产 Bean 的流程或入口
- 返回的对象:才是真正放进容器里的商品(Bean)
@Bean:就是贴在这条生产线上的标记,告诉 Spring 过来取这个对象
这个 Bean 怎么用?
在其他类中直接注入,就可以使用:
@Service
public class MessageService {
// 直接注入!Spring 自动把上面方法返回的对象给你
@Autowired
private MessageConverter messageConverter;
}
@Bean和 类注解(@Service/@Component)区别
| 方式 | 注解 | 适用场景 |
|---|---|---|
| 自己写的类 | @Service @Component | 类是你自己开发的,直接加注解即可 |
| 别人写的类(Jackson、RabbitTemplate…) | @Bean | 类不是你写的,需要你手动 new 出来并完成配置,再交给 Spring 管理 |
你的场景:
Jackson2JsonMessageConverter 是第三方提供的类,你需要:
new出来- 配置
setCreateMessageIds(true) - 交给 Spring 容器管理
所以,这种情况下通常就要使用 @Bean!
终极总结(背下来)
- 加了
@Bean的方法 = Spring 会自动调用 - 方法的返回值 = 放进容器中的 Bean 对象
- 方法名 = Bean 的默认名称
- 其他类可以直接注入并使用
最直白的一句:
你写的是一个方法,但 Spring 真正要管理的,是你这个方法 return 出来的对象!
再对应一下:
@Configuration:创建 Bean 的配置工厂类@Bean:工厂类里的 Bean 创建方法return xxx:加工完成的产品 → Bean
