1. 程式人生 > >spring——AOP原理及原始碼(三)

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方法。方法嘗試返回一個代理物件,用來代替我們的目標例項。

 

在下一篇中,我們將探究後置處理器的方法,探究究竟是如何給例項建立代理物件。

 

&n