Spring——AOP原理及源碼三【系列完】


回顧  

上一篇中,我們創建並在BeanFactory中注冊了AnnotationAwareAspectJAutoProxyCreator組件。本篇我們將要探究,這個組件是在哪里以及何時發揮作用的。

 

調試的起點

  我們直接開始調試,之前看過的斷點就直接跳過了,一直跳到下一個斷點直到來到 AbstractAutoProxyCreator.postProcessBeforeInstantiation()

 

不同后置處理器的差異

  這個方法名叫postProcessBeforeInstantiation,仔細看會發現和后置處理器BeanPostProcessor是不一樣的,我們拉到上面能看到AbstractAutoProxyCreator實現的是

SmartInstantiationAwareBeanPostProcessor這個接口

 

 進入SmartInstantiationAwareBeanPostProcessor這個接口會看到它又繼承了InstantiationAwareBeanPostProcessor

 

 再進入InstantiationAwareBeanPostProcessor可以看到它繼承的也是BeanPostProcessor

但InstantiationAwareBeanPostProcessor實現的兩個方法名字如下:

 

 不同於BeanPostProcessor中的postProcessBeforeInitialization和postProcessAfterInitialization

可見后置處理器也是存在差異的。

結論:AnnotationAwareAspectJAutoProxyCreator是InstantiationAwareBeanPostProcessor類型的后置處理器


 

從頭看起

我們還是從頭看起,看程序是怎么走到這一步的。 

 

 在Frames框中從測試方法開始,往上查看:

1、refresh刷新創建容器實例化剩下的所有單實例bean

2、finishBeanFactoryInitialization(beanFactory) 實例化剩下的所有單實例bean

 

 3、再往上走,beanFactory調用了preInstantiateSingletons()

4、一直往上走直到AbstractAutowireCapableBeanFactory.createBean(),如下圖

   第四步經歷了:

    1.   getBean
    2.   doGetBean
    3.   getSingleton
    4.   getObject
    5.   createBean

   這一系列過程和上篇中創建AnnotationAwareAspectJAutoProxyCreator的過程是一模一樣的,

  不過上篇創建AnnotationAwareAspectJAutoProxyCreator時,我們經歷上述過程后進入的是doCreateBean方法,最終創建出了bean

而在這里,我們執行的是在doCreateBean上面的resolveBeforeInstantiation方法


 

(這時AnnotationAwareAspectJAutoProxyCreator早已經創建好放入容器,我們現在做的是完成其他所有bean的實例化)

如下圖,我們可以發現,當前的resolveBeforeInstantiation正是在doCreateBean方法的上面

說明當時也調用了resolveBeforeInstantiation方法,只不過返回的bean為null,所以才有了調用doCreateBean來創建bean


 

現在我們可以知道,在所有bean創建之前,都會先調用resolveBeforeInstantiation方法

  方法上的注釋表明,方法會給后置處理器一個機會來返回目標bean實例的代理對象。也就是返回一個代理對象來代替我們將要創建的的目標bean

  現在我們把注意力放在resolveBeforeInstantiation這個方法上

  在方法棧中繼續往上查看,我們來到了resolveBeforeInstantiation方法的1011行

  從1011到1013行,調用applyBeanPostProcessorsBeforeInstantiation返回bean,接着進行判斷,如果返回的bean不為null

  接着執行applyBeanPostProcessorsAfterInitialization方法

 

  接下來我們先進入applyBeanPostProcessorsBeforeInstantiation方法,將會循環遍歷所有的后置處理器

判斷如果是InstantiationAwareBeanPostProcessor類型,就執行它的postProcessBeforeInstantiation方法

 

上面我們提到過后置處理器存在差異,我們的AnnotationAwareAspectJAutoProxyCreator剛好就是屬於InstantiationAwareBeanPostProcessor這個類型

所以接下來我們來到當初設置的的后置處理器斷點,並執行AnnotationAwareAspectJAutoProxyCreator的postProcessBeforeInstantiation方法

 

 

總結

   由以上整個過程,我們可以得出:在所有bean實例化的時候,都會調用AnnotationAwareAspectJAutoProxyCreator的postProcessBeforeInstantiation方法。方法嘗試返回一個代理對象,用來代替我們的目標實例。

 

下一篇中,我們將探究后置處理器的方法,探究究竟是如何給實例創建代理對象。

 

 


免責聲明!

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



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