这篇文章主要介绍了春天中怎么创建事务,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
春天事务执行原理通过创建一个BeanFactoryTransactionAttributeSourceAdvisor,并把TransactionInterceptor注入进的去,而TransactionInterceptor实现了建议接口。而Spring Aop在春天中会把顾问中的建议转换成拦截器链,然后调用。
执行流程
- <李>
获取对应事务属性,也就是获取@ transactional注解上的属性
李> <李>获取TransactionManager,常用的如DataSourceTransactionManager事务管理
李> <李>在目标方法执行前获取事务信息并创建事务
李> <李>回调执行下一个调用链
李> <李>一旦出现异常,尝试异常处理,回滚事务
李> <李>提交事务
具体分析
获取对应事务属性,具体代码执行流程如下:
final TransactionAttribute txAttr =, getTransactionAttributeSource () .getTransactionAttribute(方法,targetClass);
protected TransactionAttribute computeTransactionAttribute (Method 方法,Class<?祝辞,targetClass), { ,//不要# 39;t allow no-public methods as 必需的。 ,//1只allowPublicMethodsOnly()返回真,只能是公共方法 ,if (allowPublicMethodsOnly (),,,, ! Modifier.isPublic (method.getModifiers ())), { return 才能;零; ,} ,//Ignore CGLIB  subclasses 作用;introspect 从而actual user 类。 ,Class<?祝辞,userClass =, ClassUtils.getUserClass (targetClass);//大敌;从而,method may be 提醒an 界面,,but need attributes 得到我方表示歉意,target 类。 ,//If 从而target class is 空,,,method will be 不变。 ,//方法代表接口中的方法,specificMethod代表实现类的方法 ,Method specificMethod =, ClassUtils.getMostSpecificMethod(方法,userClass); ,//If 断开连接,我方表示歉意dealing with method with generic 参数,find 从而original 方法。 ,//处理泛型=,,specificMethod  BridgeMethodResolver.findBridgedMethod (specificMethod); ,//First try  is 从而method 拷贝,target 类。 ,//查看方法中是否存在事务 ,TransactionAttribute txAttr =, findTransactionAttribute (specificMethod); ,if (txAttr !=, null), { return 才能;txAttr; ,} ,//Second try  is 从而transaction attribute 提醒,target 类。 ,//查看方法所在类是否存在事务声明=,,txAttr  findTransactionAttribute (specificMethod.getDeclaringClass ()); ,if (txAttr !=, null ,,, ClassUtils.isUserLevelMethod(方法),{ return 才能;txAttr; ,} ,//如果存在接口,则在接口中查找 ,if (specificMethod !=,方法),{//才能,Fallback is 用look at 从而original 方法。//查才能找接口方法 时间=txAttr 才能;findTransactionAttribute(方法); if 才能;(txAttr !=, null), { ,,return txAttr; ,,}//才能,Last fallback is 从而class of 从而original 方法。//到才能接口类中寻找 时间=txAttr 才能;findTransactionAttribute (method.getDeclaringClass ()); if 才能;(txAttr !=, null ,,, ClassUtils.isUserLevelMethod(方法),{ ,,return txAttr; ,,} ,} ,return 零; }
getTransactionAttributeSource()获得的对象是在ProxyTransactionManagementConfiguration创建bean时注入的AnnotationTransactionAttributeSource对象。AnnotationTransactionAttributeSource中getTransactionAttributeSource方法主要逻辑交给了computeTransactionAttribute方法,所以我们直接看computeTransactionAttribute代码实现。
computeTransactionAttribute方法执行的逻辑是:
- <李>
判断是不是只运行公共方法,在AnnotationTransactionAttributeSource构造方法中传入正确。若方法不是公共方法,则返回零。
李> <李>得到具体的方法,方法方法可能是接口方法或者泛型方法。
李> <李>查看方法上是否存在事务
李> <李>查看方法所在类上是否存在事务
李> <李>查看接口的方法是否存在事务,查看接口上是否存在事务。
李>