摘要:代碼示例自定義實(shí)現(xiàn)注冊運(yùn)行和預(yù)想一樣,輸出結(jié)果為,如果移除掉注解的屬性,輸出結(jié)果為總結(jié)在大多數(shù)情況下,我們應(yīng)該避免使用任何接口,除非我們需要它們。
通過如下前序兩篇文章:
Spring Bean 生命周期之“我從哪里來”?
Spring Bean 生命周期之“我要到哪里去”?
我們了解了 Spring Bean 的生命周期核心內(nèi)容,bean 是如何被初始化變?yōu)?Ready for Use 的狀態(tài),當(dāng)資源被回收時又是如何被 destroy 的,但 Spring Bean Life Cycle圖并未被全部點(diǎn)亮,這篇文章將點(diǎn)亮剩余內(nèi)容,同時說說你常見的 XxxxAware 接口
為什么要說 Spring Bean 生命周期又說 Aware 呢?下來點(diǎn)亮剩下內(nèi)容你也許就明白了:
在 Spring Bean Ready for Use之前的起源當(dāng)然是要調(diào)用構(gòu)造器,所以 Constructor 毋庸置疑是創(chuàng)建 Spring Bean 的第一步
通過 Setter 方法完成依賴注入,SDI (Setter Dependency Injection)
依賴注入一旦結(jié)束,BeanNameAware.setBeanName() 會被調(diào)用,它設(shè)置該 bean 在 Bean Factory 中的名稱
接下來調(diào)用 BeanClassLoaderAware.setBeanClassLoader() ,為 bean 實(shí)例提供類加載器,我們知道所有類都是要通過類加載器加載到上下文的,關(guān)于類的加載機(jī)制/雙親委派模型(大廠都愛問的面試題)內(nèi)容會在后續(xù)給出來,讓你透徹的了解
然后 BeanFactoryAware.setBeanFactory() 會被調(diào)用為 bean 實(shí)例提供其所擁有的 factory
關(guān)于 1、2 兩點(diǎn)我要額外多說一些內(nèi)容,請看下面代碼:
這里,我們嘗試通過構(gòu)造器訪問自動注入的 field Environment env,當(dāng)構(gòu)造器被調(diào)用時,Spring Bean 還沒被完全初始化,這就會導(dǎo)致 NullPointerExceptions;
我們變換一下方式:
這種方式,Environment 實(shí)例被安全注入之后才調(diào)用 @PostConstruct標(biāo)記的方法,這樣就不會拋出 NullPointerException 了。
這會回看周期圖,有沒有豁然開朗?
敲黑板等所有 Spring Bean 都完成依賴注入(周期圖中的 Setter Methods 部分)再使用 bean 的引用才是安全的方式,
后續(xù)會有一個章節(jié)專門說一說面試經(jīng)常被問起的 Spring 有幾種依賴注入方式的尷尬問題,請關(guān)注后續(xù)文章
到這里終于可以說一說 Aware 了,且看
AwareAware 翻譯過來可以理解為"察覺的;注意到的;感知的" ,XxxxAware 也就是對....感知的,沒有 Aware 就是無感知的嗎?對嘍
Spring 的依賴注入最大亮點(diǎn)就是所有的 Bean 對 Spring 容器的存在是沒有意識的,拿 [Spring Bean 生命周期之“我從哪里來”?]() 文章中“小學(xué)生入少先隊(duì)”為例子說明,小學(xué)生還是那個小學(xué)生,加入少先隊(duì)還是加入共青團(tuán)只不過規(guī)則不一樣罷了
但是在實(shí)際項(xiàng)目中,我們不可避免的要用到 Spring 容器本身提供的資源(難免要有事情需要少先隊(duì)組織的幫助),這時候要讓 Bean 主動意識到 Spring 容器的存在,才能調(diào)用 Spring 所提供的資源,這就是 Spring Aware. 其實(shí) Spring Aware 是 Spring 設(shè)計(jì)為框架內(nèi)部使用的,若使用了,你的 Bean 將會和 Spring 框架耦合,所以自己不多帶帶使用,但是在讀框架源碼時希望你不再模糊.
常見的 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)系圖:
當(dāng)然不止以上這些 Aware, 通常使用 Spring Aware 的目的是為了讓 Bean 獲得 Spring 容器的服務(wù)。
代碼示例 BeanNameAware自定義 bean 實(shí)現(xiàn) BeanNameAware
注冊 bean
運(yùn)行
和預(yù)想一樣,Bean Name 輸出結(jié)果為 myCustomBeanName,如果移除掉 @Bean 注解的 name 屬性, 輸出結(jié)果為 getMyBeanName
總結(jié)在大多數(shù)情況下,我們應(yīng)該避免使用任何 Aware 接口,除非我們需要它們。實(shí)現(xiàn)這些接口會將代碼耦合到Spring框架,但是希望看過本節(jié)內(nèi)容之后閱讀框架源碼思維更加清晰
靈魂追問框架中有哪些經(jīng)典的 Aware 應(yīng)用?
到現(xiàn)在你能很好的理解 Spring Bean 的生命周期嗎?
Demo代碼涉及到 Spring Bean 生命周期的測試代碼由于內(nèi)容較多,沒有寫在此處,關(guān)注公眾號并回復(fù) 「demo」獲取相關(guān)代碼,請自行嘗試運(yùn)行結(jié)果
提高效率工具歡迎持續(xù)關(guān)注公眾號:「日拱一兵」前沿 Java 技術(shù)干貨分享
高效工具匯總
面試問題分析與解答
技術(shù)資料領(lǐng)取
后續(xù)會出一系列文章點(diǎn)亮上圖,同時進(jìn)行 Spring 知識點(diǎn)解釋與串聯(lián),在工作中充分利用 Spring 的特性
另外,還會推出 Java 多線程與 ElasticSearch 相關(guān)內(nèi)容
持續(xù)關(guān)注,帶你像讀偵探小說一樣輕松趣味學(xué)習(xí) Java 技術(shù)棧相關(guān)知識
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75486.html
摘要:入門篇學(xué)習(xí)總結(jié)時間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個人學(xué)習(xí)源碼:https://git...
摘要:容器管理的一般不需要了解容器的狀態(tài)和直接使用容器但是在某些情況下是需要在中直接對容器進(jìn)行操作的可以通過特定的接口來完成接口有以下這些接口名描述實(shí)現(xiàn)了這個接口的類都可以獲取到一個對象可以獲取容器中的所有在中可以得到應(yīng)用上下文的事件發(fā)布器從而可 容器管理的 Bean 一般不需要了解容器的狀態(tài)和直接使用容器, 但是在某些情況下, 是需要在 Bean 中直接對IOC容器進(jìn)行操作的, 可以通過特...
摘要:也是屬于方法調(diào)用棧的一環(huán),進(jìn)去有類似一段偽代碼這段代碼通過遍歷得到所有的,然后挨個執(zhí)行重寫的方法,倘若有一個方法返回的為,那么循環(huán)就會跳出,意味著下面的方法不會被執(zhí)行。 Spring源碼原理篇--容器初始化&Bean后置處理器 本篇主要是講解IOC容器初始化過程中大體進(jìn)行了哪一些工作,以及Bean后置處理器的工作原理和BeanPostProcessor在底層的使用。 環(huán)境準(zhǔn)備 編譯器...
摘要:即,的后置處理器,它的作用就是在的初始化方法前跟后進(jìn)行攔截處理。如何注冊后置處理器我們暫不作分析,著重說一下,后置處理器是如何工作的。 BeanPostProcessor即,Bean的后置處理器,它的作用就是在Bean的初始化方法前跟后進(jìn)行攔截處理。我們都知道,要想在Bean的初始化方法前后進(jìn)行工作,那必須在Bean實(shí)例創(chuàng)建完成之后,init方法執(zhí)行之前,后置處理器就已經(jīng)在容器中了,所...
摘要:創(chuàng)建及準(zhǔn)備創(chuàng)建。目前已知關(guān)心這個事件的有要注意的是在這個階段,里只有,是的加載工作的起點(diǎn)。原因是注入這些回調(diào)接口本身沒有什么意義。在其構(gòu)造函數(shù)內(nèi)部間接的給注冊了幾個與相關(guān)注解的處理器。 相關(guān)代碼在: https://github.com/chanjarster/spring-boot-all-callbacks 注:本文基于spring-boot 1.4.1.RELEASE, spri...
閱讀 1580·2021-10-14 09:42
閱讀 3823·2021-09-07 09:59
閱讀 1304·2019-08-30 15:55
閱讀 578·2019-08-30 11:17
閱讀 3343·2019-08-29 16:06
閱讀 509·2019-08-29 14:06
閱讀 3132·2019-08-28 18:14
閱讀 3653·2019-08-26 13:55