April 20, 2018

spring AOP原理之:

AbstractAutoProxyCreator

上篇文章讲完了@EnableAspectJAutoProxy注解,接下来从AbstractAutoProxyCreator出发讲解增强器的创建。

1. 如果一个实例符合拦截条件,那么它什么时候才能被AOP安排一波?

在bean实例化之后,AbstractAutowireCapableBeanFactory#initializeBean方法会遍历所有的BeanPostProcessor,这些BeanPostProcessor会对这个实例进行一些处理,例如AnnotationAwareAspectJAutoProxyCreator便是其中一个后置处理器,它首先会初始化所有的增强器,然后找找看有没有增强器匹配该实例,或者匹配该实例的方法,如果有就返回该实例的代理。

2. AnnotationAwareAspectJAutoProxyCreator的实现逻辑?

AnnotationAwareAspectJAutoProxyCreator的实现逻辑主要在父类AbstractAutoProxyCreator中:

3. 怎么初始化所有的增强器?

AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean方法会获取的所有增强器:

1.BeanFactoryAdvisorRetrievalHelper#findAdvisorBeans负责获取当前beanFactory中所有实现Advisor接口的增强器:

BeanFactoryTransactionAttributeSourceAdvisor就是负责拦截@Transactional注解并通过AOP编程实现spring事务的增强器。

2.BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors负责获取当前beanFactory中所有@AspectJ注解的切面类,然后为它们创建增强器:

apiAspect,fastCacheAspect,hystrixAspect是@AspectJ声明的切面类,可以看到BeanFactoryAspectJAdvisorsBuilder为它们创建了增强器。

4. 怎么判断一个实例要不要被代理?

调用AopUtils#findAdvisorsThatCanApply方法,获取可以应用到该实例的增强器:

可以看到spring获取到了可以应用到demoService2实例的增强器:BeanFactoryTransactionAttributeSourceAdvisor,这里用到了canApply方法做判断。

5. 假如增强器Advisor匹配到了一个实例的方法,那么如何创建它的代理?

通过AbstractAutoProxyCreator#wrapIfNecessary方法创建:

我们创建2个servcie,demoService没有事务注解,demoService2有事务注解,debug看下区别:

可以看到demoService2实例匹配到了增强器:org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor:

接着调用创建createProxy为它创建代理:

当@EnableAspectJAutoProxy注解的属性proxyTargetClass=false时,spring AOP使用CglibAopProxy#getProxy方法创建demoService2实例的代理:

可以看到在ObjenesisCglibAopProxy#createProxyClassAndInstance方法中,最终调用了enhancer.createClass()创建代理:

通过创建并返回该对象的代理,实现AOP的逻辑,至此,spring AOP的整体逻辑分析完毕!refresh()方法完成调用后代表实例初始化完成,该实例方法的执行会被相应的Interceptor代理执行,例如TransactionInterceptor。