上篇文章主要講了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]?
- 建立bean的執行個體。
- Populate()bean填充指派。
- Initializetion初始化bean(流程):
- invokeAwareMethods調用aware方法,處理實作aware接口的方法回調。
- applyBeanPostProcessorBeforeInitialazation方法裡的postProcessBeforeInitialization,後置處理器的調用。
- invokeInitMethods執行初始化方法。(@Bean注解指定初始化類)
- applyBeanPostProcessorAfterInitialazation方法裡的postProcessAfterInitialization,後置處理器的調用。
- beanPostProcessor(例子:AnnotationAwareAspectJAutoProxyCreator)建立成功。
7)、吧BeanPostProcessor注冊到BeanFactory中。
debugger代碼可以看到:
一、下圖可以看到,AnnocationConfigApplicationContext調用refresh()重新整理。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yMycDO5QjY2kDZ1gDO0EjNzYzXxQTNyADMyAzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
二、點進去之後,有registerBeanPostProcessors方法,從注解可以看到,是注冊元件後置處理器,攔截元件建立。
三、點進registerBeanPostProcessors方法,通過類型getBeanNamesForType擷取到了internalAutoProxyCreator,這個元件就是在@EnableAspectJAutoProxy注解的,裡面AspectJAutoProxyRegietrar類建立的元件。通過internalAutoProxyCreator定義資訊,建立AnnotationAwareAspectJAutoProxyCreator元件。
四、然後用addBeanPostProcessor添加後置處理器。
五、下面建立了兩個beanPsotProcessor的list集合,從注解可以看到,分離separate分别繼承了PriorityOrdered,ordered,和the rest的元件。
六、吧前面的list周遊,用beanFactory.getBean擷取bean。
七、點進去之後可以看到createBean方法,是不是很熟悉,之前文章講的bean生命周期就是調用這個方法。
八、 點進doCreateBean方法,可以看到調用populate填充指派beanPostProcess,之後再調用initializaebean方法。
九、點進去可以看到invokeAwareMethods,調用aware方法。
分别在invokeInitMethods初始化bean之前,調用postProcessBeforeInitialization方法,和初始化之後調用postProcessAfterInitialization方法,裡面都是循環ioc容器裡beanPostProcessrs,存在則後置處理器則調用,若為null,則直接傳回。
十、invokeAwareMethods裡面可以看到,判斷目前bean是否是實作了aware,根據實作的不同,setBeanFactory,這時候就開始調用setBeanFactory。