在上一篇中,咱們建立並在BeanFactory中註冊了AnnotationAwareAspectJAutoProxyCreator組件。本篇咱們將要探究,這個組件是在哪裏以及什麼時候發揮做用的。html
咱們直接開始調試,以前看過的斷點就直接跳過了,一直跳到下一個斷點直到來到 AbstractAutoProxyCreator.postProcessBeforeInstantiation()app
這個方法名叫postProcessBeforeInstantiation,仔細看會發現和後置處理器BeanPostProcessor是不同的,咱們拉到上面能看到AbstractAutoProxyCreator實現的是post
SmartInstantiationAwareBeanPostProcessor這個接口測試
進入SmartInstantiationAwareBeanPostProcessor這個接口會看到它又繼承了InstantiationAwareBeanPostProcessorspa
再進入InstantiationAwareBeanPostProcessor能夠看到它繼承的也是BeanPostProcessor代理
但InstantiationAwareBeanPostProcessor實現的兩個方法名字以下:調試
不一樣於BeanPostProcessor中的postProcessBeforeInitialization和postProcessAfterInitializationhtm
可見後置處理器也是存在差別的。對象
結論:AnnotationAwareAspectJAutoProxyCreator是InstantiationAwareBeanPostProcessor類型的後置處理器blog
咱們仍是從頭看起,看程序是怎麼走到這一步的。
在Frames框中從測試方法開始,往上查看:
一、refresh刷新建立容器實例化剩下的全部單實例bean
二、finishBeanFactoryInitialization(beanFactory) 實例化剩下的全部單實例bean
三、再往上走,beanFactory調用了preInstantiateSingletons()
四、一直往上走直到AbstractAutowireCapableBeanFactory.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方法。方法嘗試返回一個代理對象,用來代替咱們的目標實例。
在下一篇中,咱們將探究後置處理器的方法,探究到底是如何給實例建立代理對象。