Spring aop事务代理对象通过TransactionInterceptor处理目标方法事务过程,cglib方式
2017-03-05 13:34
603 查看
我们都知道,spring aop主要是通过动态代理实现,而动态代理对象的产生主要是通过CGLib,而CGlib代理对象的方法内容的增强主要是在
MethodInterceptor的intercept(),如果不熟悉CGlib的同学请先熟悉CGBlib的使用。
Spring对CGLib进行了一些封装,如DynamicAdvisedInterceptor继承自CGLib的MethodInterceptor,它的intercept()是所以事务代理对象增强代码的入口。Intercept()对事务的增强主要通过调用TransactionInterceptor的Invoke()方法。具体内容如下:
1、 TransactionInterceptor的invoke(finalMethodInvocation
invocation)中的invocation实例是CGLibProxy.CGlibMethodInterceptor,
Invoke()方法干的事情是:
1) 获取代理方法的实际类,
2) 调用TransactionAspectSupport的invokeWithinTransaction()
2、 TransactionAspectSupport的invokeWithinTransaction()主要干的事情是:
1) 获取通过TransactionAttributeSource.getTransactionAttribute()获取这个方法和类TransactionAttribute(事务属性)
2) 获取PlatformTransactionManager
3) 获取代理方法的字符串ID
4) 执行createTransactionIfNecessary()方法创建事务
5) 执行InvocationCallback实例的proceedWithInvocation()方法
6) 如果出现异常执行completeTransactionAfterThrowing(),进行事务回滚处理
7) 执行commitTransactionAfterReturning()提交事务。
3、 proceeWithInvocation()主要干的事情是:
1) 执行MethodInvocation(ReflectiveMethodInvocation)实例的procees()方法
4、 ReflectiveMethodInvocation的proceed()方法主要干的事情是:
1) 判断当前是否还有TransactionInterceptor需要执行,如果没有,则执行invokeJoinpoint()方法执行代理目标方法的方法。
2) 从interceptorsAndDynamicMethodMatchers获取下一个需要执行的interceptor,并执行
5、 createTransactionIfNecessary()主要干的事情是:
1) 通过AbstractPlatformTransactionManager.getTransaction()获取TransactionStatus
2) 通过调用prepareTransactionInfo()返回TransactionInfo
6、AbstractPlatformTransactionManager.getTransaction()主要的事情是:
1)执行doGetTransaction()获取事务对象transaction
2)判断transaction对象是否存在,如果存在则调用handleExistingTransaction()方法处理已存在事务,即根据事务定义的传播行为和隔离性做各种策略处理。
3)判断事务是否超时
4)事务传播行为是否定义为:PROPAGATION_MANDATORY,如果是则抛该方法需要在事务环境中执行的异常
5)如果该事务传播行为是require_new或者nested,或者reqired,则执行suspend()获取SuspendedResourcesHolder
6)调用doBegin()进行具体事务操作
MethodInterceptor的intercept(),如果不熟悉CGlib的同学请先熟悉CGBlib的使用。
Spring对CGLib进行了一些封装,如DynamicAdvisedInterceptor继承自CGLib的MethodInterceptor,它的intercept()是所以事务代理对象增强代码的入口。Intercept()对事务的增强主要通过调用TransactionInterceptor的Invoke()方法。具体内容如下:
1、 TransactionInterceptor的invoke(finalMethodInvocation
invocation)中的invocation实例是CGLibProxy.CGlibMethodInterceptor,
Invoke()方法干的事情是:
1) 获取代理方法的实际类,
2) 调用TransactionAspectSupport的invokeWithinTransaction()
2、 TransactionAspectSupport的invokeWithinTransaction()主要干的事情是:
1) 获取通过TransactionAttributeSource.getTransactionAttribute()获取这个方法和类TransactionAttribute(事务属性)
2) 获取PlatformTransactionManager
3) 获取代理方法的字符串ID
4) 执行createTransactionIfNecessary()方法创建事务
5) 执行InvocationCallback实例的proceedWithInvocation()方法
6) 如果出现异常执行completeTransactionAfterThrowing(),进行事务回滚处理
7) 执行commitTransactionAfterReturning()提交事务。
3、 proceeWithInvocation()主要干的事情是:
1) 执行MethodInvocation(ReflectiveMethodInvocation)实例的procees()方法
4、 ReflectiveMethodInvocation的proceed()方法主要干的事情是:
1) 判断当前是否还有TransactionInterceptor需要执行,如果没有,则执行invokeJoinpoint()方法执行代理目标方法的方法。
2) 从interceptorsAndDynamicMethodMatchers获取下一个需要执行的interceptor,并执行
5、 createTransactionIfNecessary()主要干的事情是:
1) 通过AbstractPlatformTransactionManager.getTransaction()获取TransactionStatus
2) 通过调用prepareTransactionInfo()返回TransactionInfo
6、AbstractPlatformTransactionManager.getTransaction()主要的事情是:
1)执行doGetTransaction()获取事务对象transaction
2)判断transaction对象是否存在,如果存在则调用handleExistingTransaction()方法处理已存在事务,即根据事务定义的传播行为和隔离性做各种策略处理。
3)判断事务是否超时
4)事务传播行为是否定义为:PROPAGATION_MANDATORY,如果是则抛该方法需要在事务环境中执行的异常
5)如果该事务传播行为是require_new或者nested,或者reqired,则执行suspend()获取SuspendedResourcesHolder
6)调用doBegin()进行具体事务操作
相关文章推荐
- 获得spring的指定目标对象,执行指定方法(JDK动态代理,cglib动态代理,Dubbo-Javassist代理)
- Spring 代理对象,cglib,jdk的问题思考,AOP 配置注解拦截 的一些问题.为什么不要注解在接口,以及抽象方法.
- Spring aop 通过获取代理对象实现事务切换
- 黑马程序员--09.动态与代理AOP--06【动态代理实例化的过程升级--目标对象+系统功能的参数化】【实现类似Spring的可配置AOP框架】
- SpringBoot CGLIB AOP解决Spring事务,对象调用自己方法事务失效.
- Spring进阶之路(10)-Advice简介以及通过cglib生成AOP代理对象
- Spring aop 通过获取代理对象实现事务切换
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring aop 注解方式怎么获得执行了目标的某个方法?
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- 转:Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring Aop 目标对象内部的自我调用无法实施切面的增强处理原因
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring AOP demo 和获取被CGLIB代理的对象
- Spring进阶之路(9)-Spring AOP面向切面编程概念以及通过JDK代理生成AOP代理对象
- spring AOP 代理机制、执行过程、四种实现方式及示例详解
- spring aop获取目标对象的方法对象及方法上的注解