Spring aop事务代理对象通过TransactionInterceptor处理目标方法事务过程,cglib方式

来源:互联网 发布:win10网络共享文件夹 编辑:程序博客网 时间:2024/09/21 06:35

    我们都知道,spring aop主要是通过动态代理实现,而动态代理对象的产生主要是通过CGLib,而CGlib代理对象的方法内容的增强主要是在

MethodInterceptor的intercept(),如果不熟悉CGlib的同学请先熟悉CGBlib的使用。

Spring对CGLib进行了一些封装,如DynamicAdvisedInterceptor继承自CGLibMethodInterceptor,它的intercept()是所以事务代理对象增强代码的入口。Intercept()对事务的增强主要通过调用TransactionInterceptorInvoke()方法。具体内容如下:

1、     TransactionInterceptorinvoke(finalMethodInvocation invocation)中的invocation实例是CGLibProxy.CGlibMethodInterceptor

Invoke()方法干的事情是:

1) 获取代理方法的实际类,

2) 调用TransactionAspectSupportinvokeWithinTransaction()

2、     TransactionAspectSupportinvokeWithinTransaction()主要干的事情是:

1) 获取通过TransactionAttributeSource.getTransactionAttribute()获取这个方法和类TransactionAttribute(事务属性)

2) 获取PlatformTransactionManager

3) 获取代理方法的字符串ID

4) 执行createTransactionIfNecessary()方法创建事务

5) 执行InvocationCallback实例的proceedWithInvocation()方法

6) 如果出现异常执completeTransactionAfterThrowing(),进行事务回滚处理

7) 执行commitTransactionAfterReturning()提交事务。

3、     proceeWithInvocation()主要干的事情是:

1)      执行MethodInvocation(ReflectiveMethodInvocation)实例的procees()方法

4、     ReflectiveMethodInvocationproceed()方法主要干的事情是:

1)      判断当前是否还有TransactionInterceptor需要执行,如果没有,则执行invokeJoinpoint()方法执行代理目标方法的方法。

2)      interceptorsAndDynamicMethodMatchers获取下一个需要执行的interceptor,并执行

5、     createTransactionIfNecessary()主要干的事情是:

1)      通过AbstractPlatformTransactionManager.getTransaction()获取TransactionStatus

2)      通过调用prepareTransactionInfo()返回TransactionInfo

6AbstractPlatformTransactionManager.getTransaction()主要的事情是:

    1)执行doGetTransaction()获取事务对象transaction

    2)判断transaction对象是否存在,如果存在则调用handleExistingTransaction()方法处理已存在事务,即根据事务定义的传播行为和隔离性做各种策略处理。

    3)判断事务是否超时

    4)事务传播行为是否定义为:PROPAGATION_MANDATORY,如果是则抛该方法需要在事务环境中执行的异常

    5)如果该事务传播行为是require_new或者nested,或者reqired,则执行suspend()获取SuspendedResourcesHolder

    6)调用doBegin()进行具体事务操作

0 0