您的位置:首页 > 编程语言 > Java开发

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()进行具体事务操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐