Spring 最核心的注解 @Bean 本质
直接给你一句话戳穿本质,马上彻底懂👇
答案:
这个方法本身不是 Bean,方法执行后返回的对象才是 Bean!
Spring 会把这个返回的对象放进容器里管理!
一、用最通俗的话讲 @Bean 原理
看这段代码:
java
@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 了?
画个等号你就懂了:
java
@Bean
public 消息 造消息的方法() {
造一个消息...
return 消息; // Spring 拿走这个「消息」当 Bean
}
- 方法 :只是生产 Bean 的流水线
- 返回的对象 :才是商品(Bean)
@Bean:就是贴在流水线上的标签,告诉 Spring 来拿货
三、这个 Bean 怎么用?
其他类里直接注入就能用:
java
@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:工厂里的加工方法return xxx:加工好的产品 → Bean
需要我给你演示一下怎么在别的类里注入这个 MessageConverter Bean 吗?