spring——AOP原理及源碼(三)

  上一篇中,咱們建立並在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(),以下圖

   第四步經歷了:

    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方法。方法嘗試返回一個代理對象,用來代替咱們的目標實例。

 

在下一篇中,咱們將探究後置處理器的方法,探究到底是如何給實例建立代理對象。

相關文章
相關標籤/搜索