本篇內(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 Bean Ready for Use
之前的起源當(dāng)然是要調(diào)用構(gòu)造器,所以 Constructor 毋庸置疑是創(chuàng)建 Spring Bean 的第一步
通過(guò) Setter 方法完成依賴(lài)注入,SDI (Setter Dependency Injection)
依賴(lài)注入一旦結(jié)束,BeanNameAware.setBeanName()
會(huì)被調(diào)用,它設(shè)置該 bean 在 Bean Factory 中的名稱(chēng)
接下來(lái)調(diào)用 BeanClassLoaderAware.setBeanClassLoader()
,為 bean 實(shí)例提供類(lèi)加載器,我們知道所有類(lèi)都是要通過(guò)類(lèi)加載器加載到上下文的,關(guān)于類(lèi)的加載機(jī)制/雙親委派模型(大廠都愛(ài)問(wèn)的面試題)內(nèi)容會(huì)在后續(xù)給出來(lái),讓你透徹的了解
然后 BeanFactoryAware.setBeanFactory()
會(huì)被調(diào)用為 bean 實(shí)例提供其所擁有的 factory
關(guān)于 1、2 兩點(diǎn)我要額外多說(shuō)一些內(nèi)容,請(qǐng)看下面代碼:
這里,我們嘗試通過(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
; 我們變換一下方式:
這種方式,Environment 實(shí)例被安全注入之后才調(diào)用 @PostConstruct
標(biāo)記的方法,這樣就不會(huì)拋出 NullPointerException
了。
這會(huì)回看周期圖,有沒(méi)有豁然開(kāi)朗?
敲黑板
等所有 Spring Bean 都完成依賴(lài)注入(周期圖中的 Setter Methods 部分)再使用 bean 的引用才是安全的方式,
后續(xù)會(huì)有一個(gè)章節(jié)專(zhuān)門(mén)說(shuō)一說(shuō)面試經(jīng)常被問(wèn)起的 Spring 有幾種依賴(lài)注入方式
的尷尬問(wèn)題,請(qǐng)關(guān)注后續(xù)文章
到這里終于可以說(shuō)一說(shuō) Aware 了,且看
Aware 翻譯過(guò)來(lái)可以理解為"察覺(jué)的;注意到的;感知的" ,XxxxAware 也就是對(duì)....感知的,沒(méi)有 Aware 就是無(wú)感知的嗎?對(duì)嘍
Spring 的依賴(lài)注入最大亮點(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í)希望你不再模糊.
常見(jiàn)的 Spring Aware 接口
Aware子接口 | 描述 |
---|---|
BeanNameAware | 獲取容器中 Bean 的名稱(chēng) |
BeanFactoryAware | 獲取當(dāng)前 BeanFactory ,這樣可以調(diào)用容器的服務(wù) |
ApplicationContextAware | 同上,在BeanFactory 和 ApplicationContext 的區(qū)別 中已明確說(shuō)明 |
MessageSourceAware | 獲取 Message Source 相關(guān)文本信息 |
ApplicationEventPublisherAware | 發(fā)布事件 |
ResourceLoaderAware | 獲取資源加載器,這樣獲取外部資源文件 |
來(lái)看類(lèi)關(guān)系圖:
當(dāng)然不止以上這些 Aware, 通常使用 Spring Aware 的目的是為了讓 Bean 獲得 Spring 容器的服務(wù)。
自定義 bean 實(shí)現(xiàn) BeanNameAware
注冊(cè) bean
運(yùn)行
和預(yù)想一樣,Bean Name 輸出結(jié)果為 myCustomBeanName
,如果移除掉 @Bean 注解的 name 屬性, 輸出結(jié)果為 getMyBeanName
在大多數(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í)!