【死磕 Spring】—– IOC 之 bean 的初始化
一個 bean 經歷了createBeanInstance()
被創建出來,然後又經過一番屬性注入,依賴處理,歷經千辛萬苦,千錘百煉,終於有點兒 bean 例項的樣子,能堪大任了,只需要經歷最後一步就破繭成蝶了。這最後一步就是初始化,也就是initializeBean()
,所以這篇文章我們分析doCreateBean()
中最後一步:初始化 bean。
初始化 bean 的方法其實就是三個步驟的處理,而這三個步驟主要還是根據使用者設定的來進行初始化,這三個過程為:
啟用 Aware 方法
後置處理器的應用
啟用自定義的 init 方法
啟用 Aware 方法
Aware ,英文翻譯是意識到的,感知的,Spring 提供了諸多 **Aware 介面用於輔助 Spring Bean 以程式設計的方式呼叫 Spring 容器,通過實現這些介面,可以增強 Spring Bean 的功能。
Spring 提供瞭如下系列的 Aware 介面:
-
LoadTimeWeaverAware:載入Spring Bean時織入第三方模組,如AspectJ
-
BeanClassLoaderAware:載入Spring Bean的類載入器
-
BootstrapContextAware:資源介面卡BootstrapContext,如JCA,CCI
-
ResourceLoaderAware:底層訪問資源的載入器
-
BeanFactoryAware:宣告BeanFactory
-
PortletConfigAware:PortletConfig
-
PortletContextAware:PortletContext
-
ServletConfigAware:ServletConfig
-
ServletContextAware:ServletContext
-
MessageSourceAware:國際化
-
ApplicationEventPublisherAware:應用事件
-
NotificationPublisherAware:JMX通知
-
BeanNameAware:宣告Spring Bean的名字
invokeAwareMethods()
原始碼如下:
這裡程式碼就沒有什麼好說的,主要是處理 BeanNameAware、BeanClassLoaderAware、BeanFactoryAware。關於 Aware 介面,後面會專門出篇文章對其進行詳細分析說明的。
後置處理器的應用
BeanPostProcessor 在前面介紹 bean 載入的過程曾多次遇到,相信各位不陌生,這是 Spring 中開放式框架中必不可少的一個亮點。
BeanPostProcessor 的作用是:如果我們想要在 Spring 容器完成 Bean 的例項化,配置和其他的初始化後新增一些自己的邏輯處理,那麼請使用該介面,這個介面給與了使用者充足的許可權去更改或者擴充套件 Spring,是我們對 Spring 進行擴充套件和增強處理一個必不可少的介面。
其實邏輯就是通過getBeanPostProcessors()
獲取定義的 BeanPostProcessor ,然後分別呼叫其postProcessBeforeInitialization()
、postProcessAfterInitialization()
進行業務處理。
啟用自定義的 init 方法
如果熟悉<bean>
標籤的配置,一定不會忘記init-method
方法,該方法的執行就是在這裡執行的。
首先檢查是否為 InitializingBean ,如果是的話需要執行afterPropertiesSet()
,因為我們除了可以使用init-method
來自定初始化方法外,還可以實現 InitializingBean 介面,該介面僅有一個afterPr9opertiesSet()
方法,而兩者的執行先後順序是先afterPropertiesSet()
後init-method
。
關於這篇部落格的三個問題,LZ 後面會單獨寫部落格來進行分析說明。
經過六篇部落格終於把 Spring 建立 bean 的過程進行詳細說明了,過程是艱辛的,但是收穫很大,關鍵還是要耐著性子看。
原文釋出時間為: 2018-11-19
本文作者: Java技術驛站
本文來自雲棲社群合作伙伴“ofollow,noindex" target="_blank">Java技術驛站 ”,瞭解相關資訊可以關注“Java技術驛站 ”。