Spring Aop
| 名词 | 解释 |
|---|---|
| Joinpoint 连接点 | 指的是那些可以用于把增强代码加入到业务主线中的点,那么由上图中我们可 以看出,这些点指的就是方法。在方法执行的前后通过动态代理技术加入增强的代码。在Spring框架AOP思想的技术实现中,也只支持方法类型的连接点。 |
| Pointcut 切入点 | 指的是那些已经把增强代码加入到业务主线进来之后的连接点。 |
| Advice 增强/通知 | 指的是切面类中用于提供增强功能的方法。并且不同的方法增强的时机是不一 样的。比如,开启事务肯定要在业务方法执行之前执行;提交事务要在业务方法正常执行之后执行,而回滚事务要在业务方法执行产生异常之后执行等等。那么这些就是通知的类型。其分类有:前置通知 后置通知 异常通知 最终通知 环绕通知。 |
| Target 目标对象 | 指的是代理的目标对象。即被代理对象。 |
| Proxy 代理 | 是指一个类被AOP织入增强后,生成的代理类。即代理对象。 |
| Weaving 织入 | 指的是把增强应用到目标对象来创建新的代理对象的过程。Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。 |
| Aspect 切面 | 指定是增强的代码所关注的方面,把这些相关的增强代码定义到一个类中,这个类就是切面类。例如,事务切面,它里面定义的方法就是和事务相关的,像开启事务,提交事务,回滚事务等等,不会定义其他与事务无关的方法。TrasnactionManager就是一个切面。 |
连接点:方法开始时、结束时、运行完毕时、异常时这些特殊的时机点,称之为连接点,每个方法都有连接点,连接点是一种候选点。
切入点:指AOP思想影响的是哪些方法,描述感兴趣的方法。
增强:
- 第一层指横切逻辑
- 第二层指方位点(在某一些连接点上加入横切逻辑,那么这些连接点就叫做方位点,描述的是具体 的特殊时机)
Aspect切面=切入点+增强=切入点+方位点+增强
Aop源码实现
通过断点调试知道代理对象的创建主要是在AbstractAutowireCapableBeanFactory#initializeBean通过执行AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization方法调用AbstractAutoProxyCreator#postProcessAfterInitialization方法创建,这里的AbstractAutoProxyCreator就是一个BeanPostProcessor。就是说AOP是通过BeanPostProcessor的postProcessAfterInstantiation方法实现的。



通过getAdvicesAndAdvisorsForBean匹配增强,有匹配中的就通过createProxy创建代理

buildAdvisors合并指定和通用拦截对象,适配成Advisor


在createAopProxy方法中确定使用Jdk动态代理还是Cglib,再通过getProxy方法创建代理,下面是具体的调用栈

- AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
- AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
- AbstractAutoProxyCreator#postProcessAfterInitialization
- AbstractAutoProxyCreator#wrapIfNecessary
- AbstractAutoProxyCreator#createProxy
- ProxyFactory#getProxy(java.lang.ClassLoader)
- ProxyCreatorSupport#createAopProxy
- CglibAopProxy/JdkDynamicAopProxy#getProxy(java.lang.ClassLoader)
@Transactional实现
生成代理
首先查看@EnableTransactionManagement源码发现引入了TransactionManagementConfigurationSelector
.class

- AutoProxyRegistrar
通过AutoProxyRegistrar源码发现最终注册了InfrastructureAdvisorAutoProxyCreator.class
它实现了SmartInstantiationAwareBeanPostProcessor,说明这是一个后置处理器,而且跟 spring AOP 开启@EnableAspectJAutoProxy 时注册的 AnnotationAwareAspectJProxyCreator实现的是同一个接口,所以说声明式事务是 springAOP思想的一种应用。
- ProxyTransactionManagementConfiguration
ProxyTransactionManagementConfiguration创建了一个BeanFactoryTransactionAttributeSourceAdvisor实例,这个实例可以看作是一个切点。

在判断一个bean在初始化过程中是否需要创建代理对象,都需要验证一次BeanFactoryTransactionAttributeSourceAdvisor是否是适用这个bean的切点。如果是,就需要创建代理对象,并且把BeanFactoryTransactionAttributeSourceAdvisor实例注入到代理对象中。
通过查看上文Aop源码分析中得知是通过AopUtils#findAdvisorsThatCanApply中判断切面是否适用当前bean,可以在这个地方断点分析调用堆栈,调用AopUtils#findAdvisorsThatCanApply最终通过SpringTransactionAnnotationParser#parseTransactionAnnotation判断是否适用切点。具体可以下方调用栈截图。


SpringTransactionAnnotationParser#parseTransactionAnnotation对@Transactional注解解析。
以上就是Spring在启动时对@Transactional注解的处理,其中在对相应方法创建代理对象时BeanFactoryTransactionAttributeSourceAdvisor会将自身实例加入到代理对象中。

所以最终的增强逻辑是在BeanFactoryTransactionAttributeSourceAdvisor实例中持有的TransactionInterceptor对象中。接下来看看增强部分怎么实现事务管理。
横切逻辑
TransactionInterceptor–最终事务管理者


总结

本文来自博客园,作者:Vic呼叫89,转载请注明原文链接:https://www.cnblogs.com/baojiong/p/15707690.html

浙公网安备 33010602011771号