1. 程式人生 > >Spring Aware 到底是什麼?

Spring Aware 到底是什麼?

通過如下前序兩篇文章:

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

為什麼要說 Spring Bean 生命週期又說 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 兩點我要額外多說一些內容,請看下面程式碼:

這裡,我們嘗試通過構造器訪問自動注入的 field Environment env,當構造器被呼叫時,Spring Bean 還沒被完全初始化,這就會導致 NullPointerExceptions; 我們變換一下方式:

這種方式,Environment 例項被安全注入之後才呼叫 @PostConstruct標記的方法,這樣就不會丟擲 NullPointerException 了。

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

敲黑板

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

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

到這裡終於可以說一說 Aware 了,且看

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 | 獲取資源載入器,這樣獲取外部資原始檔|

來看類關係圖:

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

程式碼示例

BeanNameAware

自定義 bean 實現 BeanNameAware

註冊 bean

執行

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

總結

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

靈魂追問

  1. 框架中有哪些經典的 Aware 應用?
  2. 到現在你能很好的理解 Spring Bean 的生命週期嗎?

Demo程式碼

涉及到 Spring Bean 生命週期的測試程式碼由於內容較多,沒有寫在此處,關注公眾號並回復 「demo」獲取相關程式碼,請自行嘗試執行結果


提高效率工具


歡迎持續關注公眾號:「日拱一兵」

  • 前沿 Java 技術乾貨分享
  • 高效工具彙總
  • 面試問題分析與解答
  • 技術資料領取

後續會出一系列文章點亮上圖,同時進行 Spring 知識點解釋與串聯,在工作中充分利用 Spring 的特性 另外,還會推出 Java 多執行緒與 ElasticSearch 相關內容

持續關注,帶你像讀偵探小說一樣輕鬆趣味學習 Java 技術棧相關知識

相關推薦

Spring Aware

type nconf war 資源加載 eight not override lose mea Spring的依賴註入最大亮點就是你所擁有的Bean對Spring容器的存在是沒有意識的。即你可以將你的容器換成別的容器,如GOOGLE Guice,這時Bean之間的耦合度降低

Spring Boot實戰筆記(五)-- Spring高級話題(Spring Aware

ktr mea 框架 .com cat 分享 aware war uic 一、Spring Aware   Spring 依賴註入的最大亮點就是你所有的 Bean 對 Spring容器的存在是沒有意識的。即你可以將你的容器替換成其他的容器,如Google Guice,這時

bean創建過程、spring BeanFactory的實現、spring aware

targe 註入 ... 強制類型轉換 ces people 實現 exceptio ans Bean的創建過程:Spring beanFactory的工廠模式實現: 解析<bean>標簽,存到一個Map<String, Object> bea

Spring——Aware相關介面

Aware,是感應和感知的意思。當bean實現了對應的Aware介面時,BeanFactory會在生產bean時根據它所實現的Aware介面,給bean注入對應的屬性,從而讓bean獲取外界的資訊。 Spring提供了一堆Aware介面: 下面列出幾個主要Aware介面作用:

SpringSpring Aware

Spring Aware Spring 的依賴注入的最大亮點就是你所有的 Bean  對 Spring 容器的存在都是無意識的.即你可以將你的容器替換成別的容器. 但是在實際的專案中,你不可避免要用到 Spring 容器本身的功能資源,這是你的 Bean 必需要意識到 Spri

spring aware的使用;spring aware 各種介面的作用解析

spring aware的使用: 使用了spring Aware 你的bean將會和spring框架耦合, spring aware 的目的是為了讓bean獲取spring容器的服務: spring 提供的aware的介面: BeanNameAware :可以獲取

Spring Aware獲取Bean和其他對象

create string imp 例子 必須 ride override 目的 creat   Spring的容器托管了所有bean,實際項目中我們經常會用到容器中的功能資源,這時候就用到了 Spring Aware。簡單來說,就是Spring Aware可以幫助你獲取到

spring Aware相關介面

[size=large]在struts框架中用過ServletRequestAware和ServletResponesAware用來獲取對應的例項,現在記錄一下spring中有哪些Aware,使用方式和ServletRe

Spring Aware理解

通過spring的依賴注入,我們所有的bean對Spring容器的存在是沒有意識的,也就是說我們可以將容器替換成其他容器。但有時在實際專案中,我們不可避免要使用到Spring容器本身的功能資源,這

SpringBoot4-spring高階話題-spring aware,多執行緒,計劃任務,條件註解@Conditional

一:Spring Aware 1,點睛      spring的依賴注入的最大亮點就是你所有的Bean對Spring容器的存在是沒有意識的,即你可以將你的容器替換成別的容器,如Google Guice,這時Bean之間的耦合度很低。     但是在實際專案中,你不可避免的要

Spring Aware容器感知技術

Spring Aware是什麼 Spring提供Aware介面能讓Bean感知Spring容器的存在,即讓Bean可以使用Spring容器所提供的資源。 Spring Aware的分類 幾種常用的Aware介面如下。 Aware介面 說明 Appli

Spring Aware 到底是什麼?

通過如下前序兩篇文章: Spring Bean 生命週期之“我從哪裡來”? Spring Bean 生命週期之“我要到哪裡去”

Spring 原始碼(十)Spring Aware自動裝配原理

在初始化Bean的initializeBean方法中執行invokeAwareMethods方法 通後置處理器ApplicationContextAwareProcessor來實現的,它實現了BeanPostProcessor介面 invokeAwareMethods 我們在初始化Bean的時候,為了保

spring 常用aware

spring 常用awarespring 常用awareBeanNameAware 獲得到容器中Bean的名稱 BeanFactoryAware 獲得當前bean Factory,從而調用容器的服務 ApplicationContextAware

springaware接口的

ram 對象 直接 loader number source clas spring servlet 一、關於spring中Aware結尾接口介紹: Spring中提供一些Aware結尾相關接口,像是BeanFactoryAware、 BeanNameAware、Appl

Spring InitializingBean 介面以及Aware介面實現的原理

     關於Spring InitializingBean 介面以及Aware介面實現的其實都在  第11步中; finishBeanFactoryInitialization() 方法中完成了3部分的內容: 1.完成對單例的非懶載入的bean 進

關於 SpringAware 介面

一、Spring所提供的Aware介面: BeanNameAware:在Bean中得到它在IOC容器中的Bean的例項的名字。 BeanFactoryAware:在Bean中得到Bean所在的IOC容器 ApplicationContextAware:在Bean中得到Bean所在的應

spring原始碼-Aware-3.4 spring原始碼-bean之載入-2

  一、Aware介面,這個也是spring的拓展之一,為啥要單獨拿出來講呢,因為他相比於BeanFactoryPostProcessor,BeanPostProcessor的實用性更加高,並且在具體的業務中也可以靈活使用,主要是能夠達到解耦的目的。   二、常用的Aware介面有:第一類:BeanName

SpringAware和Capable的區別和作用

Aware XXXAware在Spring裡表示對XXX可以感知,通俗點解釋就是:如果在某個類裡邊想要使用spring的一些東西,就可以通過實現XXXAware介面告訴Spring, Spring看到後就會給你送過來,而接收的方式是通過實現介面唯一的方法setXXX。 栗子: 比如一個類需要使用當前

23、自動裝配-Aware注入Spring底層元件&原理

23、自動裝配-Aware注入Spring底層元件&原理 Aware 介面,提供了類似回撥函式的功能 自定義元件想要使用Spring 容器底層的一些元件(Application Context,Bean Factory);自定義元件需要實現xxxAware介面;在建立物件的時候,會呼叫介面