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();
}
执行结果: