Spring事务源码剖析

Spring事务原理分析

1、代码跟踪

JdkDynamicAopProxy invoke()方法

方法getInterceptorsAndDynamicInterceptionAdvice获取到所有的执行调用chains
在这里插入图片描述在这里插入图片描述
ReflectiveMethodInvocation 的构造方法,将执行调用链赋值给ReflectiveMethodInvocation的元素是interceptorAndDynamicMethodMatchers的list。
在这里插入图片描述
currentInterceptorIndex 初始化值是-1,首先获取到第一个interceptorAndDynamicMethodMatchers,也就是exposeInvocationInterceptor,调用这个chains的invoke方法。
在这里插入图片描述
执行m1的proceed()方法,又回到了图三。这里使用了责任链设计模式。

我们看图一,其中有一个使用TransactionInterceptor类。
在这里插入图片描述
进入invoke方法,看到invokeWithinTransaction方法。在这里插入图片描述
紧接着,我们就能看到重点了,获取TransactionInfo,抛出异常之后,执行completeTransactionAfterThrowing方法,从方法名上,我们就能看出来,当抛出异常时,执行完成事务的方法。

最后最后,在返回之后,提交事务的方法。commitTransactionAfterReturning方法。

2、责任链模式demo

创建抽象的MyChains类

public abstract class MyChains {

    public void execute(MyReflectiveMethodInvocation reflectiveMethodInvocation){
        invokeMethod();
        reflectiveMethodInvocation.proceed();
    }

    protected void invokeMethod(){}
}

再分别创建Chains1继承MyChains,创建Chains2继承MyChains

public class Chains1 extends MyChains {
    @Override
    protected void invokeMethod() {
        System.out.println("chains1");
    }
}
public class Chains2 extends MyChains {
    @Override
    protected void invokeMethod() {
        System.out.println("chains2");
    }
}

核心类MyReflectionMethodInvocation

public class MyReflectiveMethodInvocation {

    private List<MyChains>  list;

    private int index = -1;

    public MyReflectiveMethodInvocation(List<MyChains> list){
        this.list = list;
    }

    public void proceed(){
        if(index>=list.size()-1){
            return;
        }
        MyChains chains = list.get(++index);
        chains.execute(this);
    }
}

测试代码

    public static void main(String[] args) {

        Chains1 chains1 = new Chains1();
        Chains2 chains2 = new Chains2();
        List<MyChains> chains = new ArrayList<>();

        chains.add(chains1);
        chains.add(chains2);
        MyReflectiveMethodInvocation methodInvocation = new MyReflectiveMethodInvocation(chains);

        methodInvocation.proceed();
    }

执行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值