天天看點

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

  小明:“媽,我被公司開除了”

  媽:“啊,為什麼呀?”,

  小明:“我罵董事長是笨蛋,公司召開高層會議還要起訴我”

  媽:“告你诽謗是吧?”

  小明:“不是,他們說要告我洩露公司機密”

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

  不管三七二十一,我們先來看看它的定義,看看spring是如何描述BeanPostProcessor的

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作
Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

View Code

  簡單點來了解,就是spring會自動從它的所有的bean定義中檢測BeanPostProcessor類型的bean定義,然後執行個體化它們,再将它們應用于随後建立的每一個bean執行個體,在bean執行個體的初始化方法回調之前調用BeanPostProcessor的postProcessBeforeInitialization的方法(進行bean執行個體屬性的填充),在bean執行個體的初始化方法回調之後調用BeanPostProcessor的postProcessAfterInitialization的方法(可以進行bean執行個體的代理封裝)

  我們先來看個簡單的示例,注意:由于spring隻是從spring容器中的bean定義中自動檢測BeanPostProcessor類型的bean定義,是以我們自定義的BeanPostProcessor要通過某種方式注冊到spring容器

  MyBeanPostProcessor

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作
Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

  AnimalConfig

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作
Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

  Dog

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作
Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

  完整執行個體工程:spring-boot-BeanPostProcessor 我們來看看啟動結果

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

  有人可能會說了:“你是個逗比把,你舉的這個例子有什麼用? 實際上,根本就不會出現BeanPostProcessor的這樣用法!”  有這樣的疑問非常正常,示例中的BeanPostProcessor的兩個方法:postProcessBeforeInitialization、postProcessAfterInitialization沒做任何的處理,都隻是直接傳回bean,這不就是:脫了褲子放屁?

  我們細看下,會發現postProcessBeforeInitialization、postProcessAfterInitialization中各多了一行列印(

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

),其實示例隻是驗證下Spring對BeanPostProcessor的支援、BeanPostProcessor的兩個方法的執行時機,是否如BeanPostProcessor 的注釋所說的那樣,實際應用中肯定不會這麼用的。那問題來了:BeanPostProcessor能用來幹什麼? 回答這個問題之前,我們先來看看spring對BeanPostProcessor的底層支援

    很明顯,我們從spring的啟動過程的refresh方法開始,如下圖

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

    此時spring容器中所有的BeanPostProcessor都進行了執行個體化,并注冊到了beanFactory的beanPostProcessors屬性中

    registerBeanPostProcessors

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作
Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

    前面我們已經知道,spring會應用BeanPostProcessor于随後建立的每一個bean執行個體,具體spring是如何做到的了,我們仔細來看看

    finishBeanFactoryInitialization方法執行個體化所有剩餘的、非延遲初始化的單例(預設情況下spring的bean都是非延遲初始化單例),具體如下

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

  其實隻要我們弄清楚了BeanPostProcessor的執行時機:在bean執行個體化之後、初始化前後被執行,允許我們對bean執行個體進行自定義的修改;隻要我們明白了這個時機點,我們就能分辨出BeanPostProcessor适用于哪些需求場景,哪些需求場景可以用BeanPostProcessor來實作

  spring中有很多BeanPostProcessor的實作,我們接觸的比較多的自動裝配:AutowiredAnnotationBeanPostProcessor也是BeanPostProcessor的實作之一,關于自動裝配我會在下篇博文中與大家一起探索

  spring中bean的生命周期如下圖

    引用自:Spring實戰系列(三)-BeanPostProcessor的妙用

Spring拓展接口之BeanPostProcessor,我們來看看它的底層實作

繼續閱讀