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呼叫了
4、一直往上走直到AbstractAutowireCapableBeanFactory.createBean(),如下圖
第四步經歷了:
- getBean
- doGetBean
- getSingleton
- getObject
- 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