天天看點

AOP源碼解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源碼從入門到精通(十九)

上篇文章主要講了AOP的@EnableAspectAutoProxy注解,裡面導入的類和執行的後置處理器:

​​AOP源碼解析(1)---Spring源碼從入門到精通(十八)​​

閱讀本篇文章,一定要先閱讀上篇文章,運作的源碼是基于上篇文章的代碼,才友善了解,如果跳着閱讀,感覺内容生澀,概不負責。

1、首先傳入配置類到annocationConfigApplicationContext,建立ioc容器。

2、之後注冊配置類,調用refresh(),重新整理容器。

3、registerBeanPostProcessor方法注冊bean後置處理器,來攔截bean的建立。

1)、先按類型擷取ioc容器中beanPostProcessor所有的元件。

2)、給容器中加别的BeanPostProcessor。

3)、優先注冊實作PriorityOrdered接口的BeanPostProcessor。

4)、next給容器中注冊實作ordered接口的beanPostProcessor。

5)、注冊沒實作優先級接口的BeanPostProcessor。

6)、注冊BeanPostProcessor,就是建立此對象,放入IOC容器。

那麼如何建立internalAutoProxyCreator類型的對象[AnnotationAwareAspectJAutoProxyCreator]?

  1. 建立bean的執行個體。
  2. Populate()bean填充指派。
  3. Initializetion初始化bean(流程):
  4. invokeAwareMethods調用aware方法,處理實作aware接口的方法回調。
  5. applyBeanPostProcessorBeforeInitialazation方法裡的postProcessBeforeInitialization,後置處理器的調用。
  6. invokeInitMethods執行初始化方法。(@Bean注解指定初始化類)
  7. applyBeanPostProcessorAfterInitialazation方法裡的postProcessAfterInitialization,後置處理器的調用。
  8. beanPostProcessor(例子:AnnotationAwareAspectJAutoProxyCreator)建立成功。

7)、吧BeanPostProcessor注冊到BeanFactory中。

debugger代碼可以看到:

一、下圖可以看到,AnnocationConfigApplicationContext調用refresh()重新整理。

AOP源碼解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源碼從入門到精通(十九)

二、點進去之後,有registerBeanPostProcessors方法,從注解可以看到,是注冊元件後置處理器,攔截元件建立。

AOP源碼解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源碼從入門到精通(十九)

三、點進registerBeanPostProcessors方法,通過類型getBeanNamesForType擷取到了internalAutoProxyCreator,這個元件就是在@EnableAspectJAutoProxy注解的,裡面AspectJAutoProxyRegietrar類建立的元件。通過internalAutoProxyCreator定義資訊,建立AnnotationAwareAspectJAutoProxyCreator元件。

四、然後用addBeanPostProcessor添加後置處理器。

五、下面建立了兩個beanPsotProcessor的list集合,從注解可以看到,分離separate分别繼承了PriorityOrdered,ordered,和the rest的元件。

AOP源碼解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源碼從入門到精通(十九)

 六、吧前面的list周遊,用beanFactory.getBean擷取bean。

AOP源碼解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源碼從入門到精通(十九)

七、點進去之後可以看到createBean方法,是不是很熟悉,之前文章講的bean生命周期就是調用這個方法。

AOP源碼解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源碼從入門到精通(十九)

八、  點進doCreateBean方法,可以看到調用populate填充指派beanPostProcess,之後再調用initializaebean方法。

AOP源碼解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源碼從入門到精通(十九)

九、點進去可以看到invokeAwareMethods,調用aware方法。

分别在invokeInitMethods初始化bean之前,調用postProcessBeforeInitialization方法,和初始化之後調用postProcessAfterInitialization方法,裡面都是循環ioc容器裡beanPostProcessrs,存在則後置處理器則調用,若為null,則直接傳回。

AOP源碼解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源碼從入門到精通(十九)

十、invokeAwareMethods裡面可以看到,判斷目前bean是否是實作了aware,根據實作的不同,setBeanFactory,這時候就開始調用setBeanFactory。