跳到主要内容

吃透Spring源码(二十二):事物执行流程

文章目录

    • 执行流程
      • 1,AOP拦截器入口
      • 2,TransactionInterceptor
  • 事物的核心处理
  • 一,获取事物
    • 1,doGetTransaction()获取当前事物
    • 2,如果当前已存在事物
    • 3,如果当前事物不存在
  • 二,挂起事物
  • 三,恢复事物
  • 四,执行目标方法
  • 五,异常回滚
  • 六,事物提交
  • 七,总结

执行流程

1,AOP拦截器入口

测试类:

public class TransactionTest {


public static void main(String[] args) {


AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TransactionConfig.class);
BookService bean = applicationContext.getBean(BookService.class);
// 调用目标方法
bean.checkout("小明",1);
}
}

bean是代理类,bean.checkout("小明",1);会调到代理类中,然后回调到DynamicAdvisedInterceptor#intercept()方法:

private static class DynamicAdvisedInterceptor implements MethodInterceptor, Serializable {


public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {



// 省略部分代码...
try {



// 从advised中获取配置好的AOP通知
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
Object retVal;

// 如果没有aop通知配置,那么直接调用target对象的调用方法
if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) {


Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method, args);
// 如果拦截器链为空则直接激活原方法
retVal = methodProxy.invoke(target, argsToUse);
}
else {



// 通过cglibMethodInvocation来启动advice通知
retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
}
retVal = processReturnType(proxy, target, method, retVal);
return retVal;
}
}
}