吃透Spring源码(二十二):事物执行流程
文章目录
-
- 执行流程
-
-
- 1,AOP拦截器入口
- 2,TransactionInterceptor
-
- 事物的核心处理
- 一,获取事物
-
- 1,
doGetTransaction()获取当前事物 - 2,如果当前已存在事物
- 3,如果当前事物不存在
- 1,
- 二,挂起事物
- 三,恢复事物
- 四,执行目标方法
- 五,异常回滚
- 六,事物提交
- 七,总结
执行流程
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;
}
}
}