Spring最核心的注解@Bean本質(zhì)用法及說(shuō)明
Spring 最核心的注解@Bean本質(zhì)
直接給你一句話戳穿本質(zhì),馬上徹底懂
答案:
這個(gè)方法本身不是 Bean,方法執(zhí)行后返回的對(duì)象才是 Bean!
Spring 會(huì)把這個(gè)返回的對(duì)象放進(jìn)容器里管理!
用最通俗的話講@Bean原理
看這段代碼:
@Configuration // 配置類(lèi)
public class MesaageConfig {
// 加了 @Bean 的方法
@Bean
public MessageConverter messageConverter() {
// 1. 自己 new 對(duì)象
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
// 2. 自己配置對(duì)象
converter.setCreateMessageIds(true);
// 3. 返回對(duì)象
return converter;
}
}
Spring 看到@Bean會(huì)做什么?
Spring 會(huì)自動(dòng)調(diào)用這個(gè)方法,拿到返回值,然后:
- 把返回的對(duì)象放進(jìn) Spring 容器
- 給這個(gè) Bean 起名 = 方法名 messageConverter
- 以后別人想用,直接注入就行
總結(jié):
@Bean = 告訴 Spring:執(zhí)行我這個(gè)方法,把返回的對(duì)象給我當(dāng)成 Bean 管理!
- 方法 = 造 Bean 的工廠
- 返回值 = 真正的 Bean
問(wèn):它不是方法嗎?怎么成 Bean 了?
畫(huà)個(gè)等號(hào)你就懂了:
@Bean
public 消息 造消息的方法() {
造一個(gè)消息...
return 消息; // Spring 拿走這個(gè)「消息」當(dāng) Bean
}
- 方法:只是生產(chǎn) Bean 的流水線
- 返回的對(duì)象:才是商品(Bean)
@Bean:就是貼在流水線上的標(biāo)簽,告訴 Spring 來(lái)拿貨
這個(gè) Bean 怎么用?
其他類(lèi)里直接注入就能用:
@Service
public class MessageService {
// 直接注入!Spring 自動(dòng)把上面方法返回的對(duì)象給你
@Autowired
private MessageConverter messageConverter;
}
@Bean和 類(lèi)注解(@Service/@Component)區(qū)別
| 方式 | 注解 | 適用場(chǎng)景 |
|---|---|---|
| 自己寫(xiě)的類(lèi) | @Service @Component | 類(lèi)是你寫(xiě)的,直接加注解 |
| 別人寫(xiě)的類(lèi)(Jackson、RabbitTemplate…) | @Bean | 類(lèi)不是你寫(xiě)的,你需要new 出來(lái) + 配置,交給 Spring |
你的場(chǎng)景:
Jackson2JsonMessageConverter 是別人寫(xiě)的類(lèi),你需要:
new出來(lái)- 配置
setCreateMessageIds(true) - 交給 Spring
→ 必須用 @Bean!
終極總結(jié)(背下來(lái))
- 加了
@Bean的方法 = Spring 會(huì)自動(dòng)調(diào)用 - 方法的返回值 = 放進(jìn)容器的 Bean 對(duì)象
- 方法名 = Bean 的名字
- 別人可以直接注入使用
最直白的一句:
你寫(xiě)的是方法,但 Spring 要的是你方法 return 出來(lái)的那個(gè)對(duì)象!
再給你對(duì)應(yīng)一下:
@Configuration:造 Bean 的工廠類(lèi)@Bean:工廠里的加工方法return xxx:加工好的產(chǎn)品 → Bean
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue計(jì)算屬性computed和監(jiān)聽(tīng)屬性watch的使用解讀
本文介紹了Vue.js中的計(jì)算屬性(computed)和監(jiān)聽(tīng)屬性(watch)的區(qū)別和使用場(chǎng)景,計(jì)算屬性是基于依賴(lài)緩存的,只有在相關(guān)依賴(lài)發(fā)生改變時(shí)才會(huì)重新求值,適合用于簡(jiǎn)單的數(shù)據(jù)處理和計(jì)算,而監(jiān)聽(tīng)屬性則用于監(jiān)聽(tīng)數(shù)據(jù)變化時(shí)執(zhí)行異步或開(kāi)銷(xiāo)較大的操作,適合用于處理復(fù)雜的數(shù)據(jù)邏輯2025-12-12
最新hadoop安裝教程及hadoop的命令使用(親測(cè)可用)
這篇文章主要介紹了最新hadoop安裝教程(親測(cè)可用),本文主要講解了如何安裝hadoop、使用hadoop的命令及遇到的問(wèn)題解決,需要的朋友可以參考下2022-06-06
SpringBoot-JWT生成Token和攔截器的使用(訪問(wèn)受限資源)
本文主要介紹了SpringBoot-JWT生成Token和攔截器的使用(訪問(wèn)受限資源),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
從入門(mén)到精通:Java List遍歷修改的完全指南
在Java中,我們經(jīng)常需要遍歷List集合并對(duì)其中的元素進(jìn)行修改,這可以通過(guò)使用迭代器或for循環(huán)來(lái)實(shí)現(xiàn),需要的朋友可以參考下2023-10-10
Java實(shí)現(xiàn)生成自定義時(shí)長(zhǎng)的靜音音頻
這篇文章主要介紹了如何通過(guò)Java實(shí)現(xiàn)一個(gè)音頻工具類(lèi),可以實(shí)現(xiàn)生成一段自定義時(shí)長(zhǎng)(精確到毫秒)的wav音頻。感興趣的小伙伴可以了解一下2022-01-01
Elasticsearch索引結(jié)構(gòu)與算法解析
?作為搜索引擎的一部分,ES自然具有速度快、結(jié)果準(zhǔn)確、結(jié)果豐富等特點(diǎn),那么ES是如何達(dá)到“搜索引擎”級(jí)別的查詢(xún)效率呢?首先是索引,其次是壓縮算法,接下來(lái)我們就一起了解下ES的索引結(jié)構(gòu)和壓縮算法2023-04-04

