在上一篇中,我們創建併在BeanFactory中註冊了AnnotationAwareAspectJAutoProxyCreator組件。本篇我們將要探究,這個組件是在哪裡以及何時發揮作用的。 ...
在上一篇中,我們創建併在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(),如下圖
第四步經歷了:
- 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方法。方法嘗試返回一個代理對象,用來代替我們的目標實例。
在下一篇中,我們將探究後置處理器的方法,探究究竟是如何給實例創建代理對象。