SpringAware到底是什么?-創(chuàng)新互聯(lián)

Spring Aware到底是什么?

堅(jiān)守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都成都輕質(zhì)隔墻板小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站制作營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

通過如下前序兩篇文章:

  1. Spring Bean 生命周期之“我從哪里來”?
  2. Spring Bean 生命周期之“我要到哪里去”?
    我們了解了 Spring Bean 的生命周期核心內(nèi)容,bean 是如何被初始化變?yōu)?code>Ready for Use的狀態(tài),當(dāng)資源被回收時(shí)又是如何被 destroy 的,但Spring Bean Life Cycle圖并未被全部點(diǎn)亮,這篇文章將點(diǎn)亮剩余內(nèi)容,同時(shí)說說你常見的 XxxxAware 接口

為什么要說 Spring Bean 生命周期又說 Aware 呢?下來點(diǎn)亮剩下內(nèi)容你也許就明白了:

Spring Aware到底是什么?

  1. 在 Spring BeanReady for Use之前的起源當(dāng)然是要調(diào)用構(gòu)造器,所以 Constructor 毋庸置疑是創(chuàng)建 Spring Bean 的第一步
  2. 通過 Setter 方法完成依賴注入,SDI (Setter Dependency Injection)
  3. 依賴注入一旦結(jié)束,BeanNameAware.setBeanName()會(huì)被調(diào)用,它設(shè)置該 bean 在 Bean Factory 中的名稱
  4. 接下來調(diào)用BeanClassLoaderAware.setBeanClassLoader(),為 bean 實(shí)例提供類加載器,我們知道所有類都是要通過類加載器加載到上下文的,關(guān)于類的加載機(jī)制/雙親委派模型(大廠都愛問的面試題)內(nèi)容會(huì)在后續(xù)給出來,讓你透徹的了解
  5. 然后BeanFactoryAware.setBeanFactory()會(huì)被調(diào)用為 bean 實(shí)例提供其所擁有的 factory

關(guān)于 1、2 兩點(diǎn)我要額外多說一些內(nèi)容,請(qǐng)看下面代碼:
Spring Aware到底是什么?

這里,我們嘗試通過構(gòu)造器訪問自動(dòng)注入的 fieldEnvironment env,當(dāng)構(gòu)造器被調(diào)用時(shí),Spring Bean 還沒被完全初始化,這就會(huì)導(dǎo)致NullPointerExceptions
我們變換一下方式:
Spring Aware到底是什么?

這種方式,Environment 實(shí)例被安全注入之后才調(diào)用@PostConstruct標(biāo)記的方法,這樣就不會(huì)拋出NullPointerException了。

這會(huì)回看周期圖,有沒有豁然開朗?

敲黑板

等所有 Spring Bean 都完成依賴注入(周期圖中的 Setter Methods 部分)再使用 bean 的引用才是安全的方式,

后續(xù)會(huì)有一個(gè)章節(jié)專門說一說面試經(jīng)常被問起的Spring 有幾種依賴注入方式的尷尬問題,請(qǐng)關(guān)注后續(xù)文章

到這里終于可以說一說 Aware 了,且看

Aware

Spring Aware到底是什么?

Aware 翻譯過來可以理解為"察覺的;注意到的;感知的" ,XxxxAware 也就是對(duì)....感知的,沒有 Aware 就是無感知的嗎?對(duì)嘍

Spring 的依賴注入大亮點(diǎn)就是所有的 Bean 對(duì) Spring 容器的存在是沒有意識(shí)的,拿 [Spring Bean 生命周期之“我從哪里來”?]() 文章中“小學(xué)生入少先隊(duì)”為例子說明,小學(xué)生還是那個(gè)小學(xué)生,加入少先隊(duì)還是加入共青團(tuán)只不過規(guī)則不一樣罷了
但是在實(shí)際項(xiàng)目中,我們不可避免的要用到 Spring 容器本身提供的資源(難免要有事情需要少先隊(duì)組織的幫助),這時(shí)候要讓 Bean 主動(dòng)意識(shí)到 Spring 容器的存在,才能調(diào)用 Spring 所提供的資源,這就是 Spring Aware. 其實(shí) Spring Aware 是 Spring 設(shè)計(jì)為框架內(nèi)部使用的,若使用了,你的 Bean 將會(huì)和 Spring 框架耦合,所以自己不單獨(dú)使用,但是在讀框架源碼時(shí)希望你不再模糊.

常見的 Spring Aware 接口

Aware子接口描述
BeanNameAware獲取容器中 Bean 的名稱
BeanFactoryAware獲取當(dāng)前 BeanFactory ,這樣可以調(diào)用容器的服務(wù)
ApplicationContextAware同上,在BeanFactory 和 ApplicationContext 的區(qū)別 中已明確說明
MessageSourceAware獲取 Message Source 相關(guān)文本信息
ApplicationEventPublisherAware發(fā)布事件
ResourceLoaderAware獲取資源加載器,這樣獲取外部資源文件

來看類關(guān)系圖:
Spring Aware到底是什么?

當(dāng)然不止以上這些 Aware, 通常使用 Spring Aware 的目的是為了讓 Bean 獲得 Spring 容器的服務(wù)。

代碼示例

BeanNameAware

自定義 bean 實(shí)現(xiàn) BeanNameAware
Spring Aware到底是什么?

注冊(cè) bean
Spring Aware到底是什么?

運(yùn)行
Spring Aware到底是什么?

和預(yù)想一樣,Bean Name 輸出結(jié)果為myCustomBeanName,如果移除掉 @Bean 注解的 name 屬性, 輸出結(jié)果為getMyBeanName

總結(jié)

在大多數(shù)情況下,我們應(yīng)該避免使用任何 Aware 接口,除非我們需要它們。實(shí)現(xiàn)這些接口會(huì)將代碼耦合到Spring框架,但是希望看過本節(jié)內(nèi)容之后閱讀框架源碼思維更加清晰

靈魂追問

  1. 框架中有哪些經(jīng)典的 Aware 應(yīng)用?
  2. 到現(xiàn)在你能很好的理解 Spring Bean 的生命周期嗎?

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

本文標(biāo)題:SpringAware到底是什么?-創(chuàng)新互聯(lián)
新聞來源:http://www.muchs.cn/article2/dgisoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名標(biāo)簽優(yōu)化、Google網(wǎng)頁設(shè)計(jì)公司、微信小程序網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作