Spring事务源码剖析

Spring事务原理分析

1、代码跟踪

JdkDynamicAopProxy invoke()方法

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

我们看图一,其中有一个使用TransactionInterceptor类。
Spring事务源码剖析_第4张图片
进入invoke方法,看到invokeWithinTransaction方法。Spring事务源码剖析_第5张图片
紧接着,我们就能看到重点了,获取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  list;

    private int index = -1;

    public MyReflectiveMethodInvocation(List 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 chains = new ArrayList<>();

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

        methodInvocation.proceed();
    }

执行结果:

Spring事务源码剖析_第6张图片

你可能感兴趣的:(Spring)