亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Aware到底是什么?

發布時間:2020-06-22 02:09:52 來源:網絡 閱讀:177 作者:日拱一兵 欄目:編程語言

Spring Aware到底是什么?

通過如下前序兩篇文章:

  1. Spring Bean 生命周期之“我從哪里來”?
  2. Spring Bean 生命周期之“我要到哪里去”?
    我們了解了 Spring Bean 的生命周期核心內容,bean 是如何被初始化變為 Ready for Use 的狀態,當資源被回收時又是如何被 destroy 的,但 Spring Bean Life Cycle圖并未被全部點亮,這篇文章將點亮剩余內容,同時說說你常見的 XxxxAware 接口

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

Spring Aware到底是什么?

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

關于 1、2 兩點我要額外多說一些內容,請看下面代碼:
Spring Aware到底是什么?

這里,我們嘗試通過構造器訪問自動注入的 field Environment env,當構造器被調用時,Spring Bean 還沒被完全初始化,這就會導致 NullPointerExceptions
我們變換一下方式:
Spring Aware到底是什么?

這種方式,Environment 實例被安全注入之后才調用 @PostConstruct標記的方法,這樣就不會拋出 NullPointerException 了。

這會回看周期圖,有沒有豁然開朗?

敲黑板

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

后續會有一個章節專門說一說面試經常被問起的 Spring 有幾種依賴注入方式的尷尬問題,請關注后續文章

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

Aware

Spring Aware到底是什么?

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

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

常見的 Spring Aware 接口

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

來看類關系圖:
Spring Aware到底是什么?

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

代碼示例

BeanNameAware

自定義 bean 實現 BeanNameAware
Spring Aware到底是什么?

注冊 bean
Spring Aware到底是什么?

運行
Spring Aware到底是什么?

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

總結

在大多數情況下,我們應該避免使用任何 Aware 接口,除非我們需要它們。實現這些接口會將代碼耦合到Spring框架,但是希望看過本節內容之后閱讀框架源碼思維更加清晰

靈魂追問

  1. 框架中有哪些經典的 Aware 應用?
  2. 到現在你能很好的理解 Spring Bean 的生命周期嗎?
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

密山市| 龙口市| 蓝山县| 盐津县| 酒泉市| 汨罗市| 鹿泉市| 霍城县| 石阡县| 南京市| 常德市| 墨脱县| 方正县| 芦溪县| 毕节市| 鄯善县| 临猗县| 洞头县| 十堰市| 罗田县| 巴青县| 天全县| 德令哈市| 石家庄市| 哈尔滨市| 萨迦县| 中西区| 夏河县| 漾濞| 涪陵区| 古丈县| 太仓市| 南华县| 邵阳县| 承德县| 满城县| 兴安县| 巨野县| 红桥区| 汨罗市| 方山县|