Spring AOP的使用及源码解读 (二)

相关阅读

Spring AOP的使用及源码解读 (一)

了解了如何用之后,我们就需要了解背后实现了原理,也就是相关源码的解读

1.对AOP相关核心类创建过程

[1] @EnableAspectJAutoProxy这个注解是开启切面事务,我们对这个注解进行相关源码的跟进。

  1. 跟进去后发现切面相关的注册类,点击继续跟进
    Spring AOP的使用及源码解读 (二)
    2)接下来是对registerAspectJAnnotationAutoProxyCreatorIfNecessary( )进行跟进
    Spring AOP的使用及源码解读 (二)
    3)接着继续对registerOrEscalateApcAsRequired( ) 这个方法跟进
    其中AnnotationAwareAspectJAutoProxyCreator是贯穿我们AOP中最重要的类
    Spring AOP的使用及源码解读 (二)

4)完成这一步后,我们就对AnnotationAwareAspectJAutoProxyCreator.class这个重要的类信息进行相应的声明,也就是所谓的bean id 和类名,但这里并没有完成相关的创建
Spring AOP的使用及源码解读 (二)

[2]
上面我们已经了解到了AOP的核心类为AnnotationAwareAspectJAutoProxyCreator
对这个类我们跟到最底层如下图
Spring AOP的使用及源码解读 (二)
Spring AOP的使用及源码解读 (二)
其中ProxyProcessorSupport作为组装进IOC容器的支持
SmartInstantiationAwareBeanPostProcessor作为bean后置处理器
而这个处理器真正起作用的就是InstantiationAwareBeanPostProcessor
BeanFactoryAware:能把我们的beanFactory传进来

2.总结一下上面的进行AOP的使用时,

我们主要用到了AnnotationAwareAspectJAutoProxyCreator这个类,它的bean id 为org.springframework.aop.config.internalAutoProxyCreator,它的相关处理器为InstantiationAwareBeanPostProcessor。那么了解了它的概述后,我们就对这个 AnnotationAwareAspectJAutoProxyCreator类在底层上如何创建并初始化的进行探讨

(1)点击进入
Spring AOP的使用及源码解读 (二)
(2)点击进入refresh( ) 方法
Spring AOP的使用及源码解读 (二)

(3)点击进入registerBeanPostProcessors(beanFactory);
Spring AOP的使用及源码解读 (二)

(4)点击进入registerBeanPostProcessors()该方法
Spring AOP的使用及源码解读 (二)

(5)我们这里点击进入的是226行的getBean( )方法(属于AbstractBeanFactory类)
Spring AOP的使用及源码解读 (二)
Spring AOP的使用及源码解读 (二)

(6)点击进入204行的doGetBean( )方法
Spring AOP的使用及源码解读 (二)
(7)点击进入createBean( )方法
Spring AOP的使用及源码解读 (二)
(8)点击跟进579行的initalizeBean()方法
Spring AOP的使用及源码解读 (二)
Spring AOP的使用及源码解读 (二)

(9)自此我们相关AOP的bean就创建和初始化完成了(不过做一个小提示:其实我们AOP相关的bean在这个前置处理中并没有做任何事情,而它真正执行的时候是在AbstractAutowireCapableBeanFactory.class下执行的1067行的
ibp.postProcessBeforeInstantiation(),不过这里也是返回null)
Spring AOP的使用及源码解读 (二)
(10)接下来我们对前置和后置处理说明一下
有关于处理器相关的bean前后置处理都是在 AbstractAutoProxyCreator类下执行的
不过前置方法postProcessBeforeInitialization在执行相应的判断时,都是不成立最后都是返回null
而后置方法postProcessAfterInitialization( )主要是拿到所有的执行方法,创建增强的代理对象(下一节我们会详细叙述)
Spring AOP的使用及源码解读 (二)

小结:

其实上面的步骤就已经把我们AnnotationAwareAspectJAutoProxyCreator创建好并放入我们的IOC容器了,接下来是我们创建这个普通ban 类Calculator,并且了解它是如何实现与AnnotationAwareAspectJAutoProxyCreator类进行相关联,并做到增强它的方法的。