SpringAware的原理和作用是什么

本篇內(nèi)容主要講解“Spring Aware的原理和作用是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Spring Aware的原理和作用是什么”吧!

目前成都創(chuàng)新互聯(lián)公司已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、海安網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

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

Spring Aware的原理和作用是什么

  1. 在 Spring Bean Ready for Use之前的起源當(dāng)然是要調(diào)用構(gòu)造器,所以 Constructor 毋庸置疑是創(chuàng)建 Spring Bean 的第一步

  2. 通過(guò) Setter 方法完成依賴注入,SDI (Setter Dependency Injection)

  3. 依賴注入一旦結(jié)束,BeanNameAware.setBeanName() 會(huì)被調(diào)用,它設(shè)置該 bean 在 Bean Factory 中的名稱

  4. 接下來(lái)調(diào)用 BeanClassLoaderAware.setBeanClassLoader() ,為 bean 實(shí)例提供類加載器,我們知道所有類都是要通過(guò)類加載器加載到上下文的,關(guān)于類的加載機(jī)制/雙親委派模型(大廠都愛(ài)問(wèn)的面試題)內(nèi)容會(huì)在后續(xù)給出來(lái),讓你透徹的了解

  5. 然后 BeanFactoryAware.setBeanFactory() 會(huì)被調(diào)用為 bean 實(shí)例提供其所擁有的 factory

關(guān)于 1、2 兩點(diǎn)我要額外多說(shuō)一些內(nèi)容,請(qǐng)看下面代碼: Spring Aware的原理和作用是什么

這里,我們嘗試通過(guò)構(gòu)造器訪問(wèn)自動(dòng)注入的 field Environment env,當(dāng)構(gòu)造器被調(diào)用時(shí),Spring Bean 還沒(méi)被完全初始化,這就會(huì)導(dǎo)致 NullPointerExceptions; 我們變換一下方式: Spring Aware的原理和作用是什么

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

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

敲黑板

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

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

到這里終于可以說(shuō)一說(shuō) Aware 了,且看

Aware

Spring Aware的原理和作用是什么

Aware 翻譯過(guò)來(lái)可以理解為"察覺(jué)的;注意到的;感知的" ,XxxxAware 也就是對(duì)....感知的,沒(méi)有 Aware 就是無(wú)感知的嗎?對(duì)嘍

Spring 的依賴注入最大亮點(diǎn)就是所有的 Bean 對(duì) Spring 容器的存在是沒(méi)有意識(shí)的,拿 Spring Bean 生命周期之“我從哪里來(lái)”? 文章中“小學(xué)生入少先隊(duì)”為例子說(shuō)明,小學(xué)生還是那個(gè)小學(xué)生,加入少先隊(duì)還是加入共青團(tuán)只不過(guò)規(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ū)別 中已明確說(shuō)明
MessageSourceAware獲取 Message Source 相關(guān)文本信息
ApplicationEventPublisherAware發(fā)布事件
ResourceLoaderAware獲取資源加載器,這樣獲取外部資源文件

來(lái)看類關(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框架,但是希望看過(guò)本節(jié)內(nèi)容之后閱讀框架源碼思維更加清晰

到此,相信大家對(duì)“Spring Aware的原理和作用是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)頁(yè)名稱:SpringAware的原理和作用是什么
文章源于:http://muchs.cn/article26/jchijg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、GoogleApp設(shè)計(jì)、品牌網(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)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)