Spring的BeanPostProcessor后置處理器與bean的生命周期


前言

    本文將把Spring在Bean的生命周期中涉及到的后置處理器一一梳理出來,並簡要說一下功能,至於每個后置處理器在實際擴展中的用處,還要后續慢慢探索總結。

正文

    下面一步步跟進探尋那些后置處理器們。首先進入AbstractApplicationContext類中的refresh方法,繼續追蹤至此模板方法中的finishBeanFactoryInitialization方法,然后點進beanFactory.preInstantiateSingletons()方法,進入DefaultListableBeanFactory類中,點進getBean方法,繼續點擊doGetBean方法,它是獲取bean的核心方法,但我們只關注里面lambda表達式中的createBean方法,點之進入AbstractAutowireCapableBeanFactory#createBean方法,逐漸逼近無知獸。

第一處

    在createBean方法的resolveBeforeInstantiation方法中,遇見第一處后置處理器的調用,而且一次調了兩種,分別是:InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation和

BeanPostProcessor.postProcessAfterInitialization。如下截圖所示:

 

 

此處如果before的方法返回的bean不為null, 方法返回之后在createBean方法中就不會往下走了(即后續的2-8處理器都不走)而是直接返回。

額外說一下Spring的使用實例。如果bean中有切面類,那么會調用AbstractAutoProxyCreator#postProcessBeforeInstantiation中的實現邏輯,在此方法中將切面類加入advisedBeans中,這樣后續切面會自動忽略對advisedBeans中對象的攔截。

第二處

    進入createBean中的doCreateBean方法,在createBeanInstance方法中調用了determineConstructorsFromBeanPostProcessors方法,里面是第二處后置處理器的調用:SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors。截圖如下所示,此處后置處理器用於推斷構造方法,默認調用的實現類是AutowiredAnnotationBeanPostProcessor。

 

 

 第三處

    回到doCreateBean方法,繼續往下看applyMergedBeanDefinitionPostProcessors方法,找到第三處后置處理器的調用:MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition。截圖如下所示:

 

 

 第四處

    在doCreateBean中繼續往下找,getEarlyBeanReference方法中找到第四處調用:SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference。此處用於解決循環依賴,截圖如下:

 

 

 第五處

    繼續往下,進入populateBean方法,在此方法中有兩處調用,第五處:InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation。返回布爾類型,用於判斷是不是需要屬性填充,如果返回false則直接從populateBean中返回,不再執行第6/7/8處。

 

 

 第六處

    第六處調用了兩個方法:InstantiationAwareBeanPostProcessor.postProcessProperties和InstantiationAwareBeanPostProcessor.postProcessPropertyValues。此處用於做屬性填充,截圖如下:

 

 

 第七處

    回到doCreateBean中繼續往下,進入initializeBean方法,此方法中也有兩處調用,在applyBeanPostProcessorsBeforeInitialization中調用了第七處:BeanPostProcessor.postProcessBeforeInitialization。

調用的是通常意義上BeanPostProcessor的before方法

 

 第八處

    在applyBeanPostProcessorsAfterInitialization中調用了第八處:BeanPostProcessor.postProcessAfterInitialization。調用的是通常意義上BeanPostProcessor的after方法

 

Spring的切面就是基於此方法進行的,調用的實現方法是AbstractAutoProxyCreator#postProcessAfterInitialization。它會先將切面類放入advisedBeans中,標記為true,表示需要用切面攔截。然后調用AbstractAutoProxyCreator#createProxy方法生成代理。

第九處

    第九處是在執行AbstractApplicationContext#close方法銷毀bean時觸發的,最終調用到的是DisposableBeanAdapter#destroy,在此方法中調用了:DestructionAwareBeanPostProcessor.postProcessBeforeDestruction。用於在銷毀bean之前做操作。為什么DestructionAwareBeanPostProcessor中沒有after方法?因為執行after的時候所有bean都沒了,Spring認為你也沒必要做什么擴展了。

 

 

小結

    以上就是Spring的bean聲明周期內經手的9處后置處理器調用,共涉及到5個接口,本文只是簡要說明了其作用,其真實的使用場景很多,需要后續慢慢摸索。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM