Spring AOP声明式事务

2023-11-13

Spring AOP声明式事务

Spring AOP声明式事务可以帮我们自动管理事务,在业务操作前后加入事务开始和提交,根据约定的命名规则,进行处理。哪些使用事务,哪些不使用事务,使我们专注于业务处理,提高我们开发效率。它是代理模式的设计思想。

使用aop编程,事务管理器真正在做事务做处理,用拦截器进行前后拦截执行事务,拦截哪些地方规则由连接点定义,切点是真正执行事务管理器的地方,通知是定义这整个的事务管理。

事务管理器
拦截器
连接点
切点
通知

传统spring配置

<!-- 配置事务管理器 -->
<bean name="transactionManager"
	class="org.springframework.orm.hibernate4.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

<!-- 注解方式配置事务 -->
<!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->

<!-- 拦截器方式配置事务 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
	<tx:attributes>
		<!-- 以如下关键字开头的方法使用事务 -->
		<tx:method name="add*" />
		<tx:method name="save*" />
		<tx:method name="update*" />
		<tx:method name="modify*" />
		<tx:method name="edit*" />
		<tx:method name="delete*" />
		<tx:method name="remove*" />
		<tx:method name="repair" />
		<tx:method name="deleteAndRepair" />
		<!-- 以如下关键字开头的方法不使用事务 -->
		<tx:method name="get*" propagation="SUPPORTS" />
		<tx:method name="find*" propagation="SUPPORTS" />
		<tx:method name="load*" propagation="SUPPORTS" />
		<tx:method name="search*" propagation="SUPPORTS" />
		<tx:method name="datagrid*" propagation="SUPPORTS" />
		<!-- 其他方法不使用事务 -->
		<tx:method name="*" propagation="SUPPORTS" />
	</tx:attributes>
</tx:advice>
<!-- 切面,将事务用在哪些对象上 -->
<aop:config>
	<!-- 切点 -->
	<aop:pointcut id="transactionPointcut"
		expression="execution(* edu.gdst.scientific.service.*.*(..))" />
	<aop:advisor pointcut-ref="transactionPointcut"
		advice-ref="transactionAdvice" />
</aop:config>

SpringBoot配置

Aspect
@Configuration
public class TransactionAdviceConfig {
	//连接点
	private static final String AOP_POINTCUT_EXPRESSION = "execution (* com.***.service.*.*(..))";

	// 事务管理器
	@Autowired
	private PlatformTransactionManager transactionManager;

	// 拦截器配置规则使用 事务(管理器)transactionManager
	@Bean
	public TransactionInterceptor txAdvice() {

		//默认的事务属性,使用事务txAttr_REQUIRED
		DefaultTransactionAttribute txAttr_REQUIRED = new DefaultTransactionAttribute();
		txAttr_REQUIRED.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

		//默认的事务属性,不使用事务txAttr_REQUIRED_READONLY,只读
		DefaultTransactionAttribute txAttr_REQUIRED_READONLY = new DefaultTransactionAttribute();
		txAttr_REQUIRED_READONLY.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		txAttr_REQUIRED_READONLY.setReadOnly(true);

		NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();

		//使用事务
		source.addTransactionalMethod("add*", txAttr_REQUIRED);
		source.addTransactionalMethod("save*", txAttr_REQUIRED);
		source.addTransactionalMethod("delete*", txAttr_REQUIRED);
		source.addTransactionalMethod("update*", txAttr_REQUIRED);
		source.addTransactionalMethod("exec*", txAttr_REQUIRED);
		source.addTransactionalMethod("set*", txAttr_REQUIRED);

		//只读不使用事务
		source.addTransactionalMethod("get*", txAttr_REQUIRED_READONLY);
		source.addTransactionalMethod("query*", txAttr_REQUIRED_READONLY);
		source.addTransactionalMethod("find*", txAttr_REQUIRED_READONLY);
		source.addTransactionalMethod("list*", txAttr_REQUIRED_READONLY);
		source.addTransactionalMethod("count*", txAttr_REQUIRED_READONLY);
		source.addTransactionalMethod("is*", txAttr_REQUIRED_READONLY);
		//其它只读,不使用事务
		source.addTransactionalMethod("*", txAttr_REQUIRED_READONLY);

		//根据上面的规则,使用事务管理器
		return new TransactionInterceptor(transactionManager, source);
	}

	//通知,使用上面的拦截器,根据AOP_POINTCUT_EXPRESSION连接点(规则)注入事务代码(事务管理器)
	@Bean
	public Advisor txAdviceAdvisor() {
		//切点
		AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
		//设置规则,即连接点AOP_POINTCUT_EXPRESSION
		pointcut.setExpression(AOP_POINTCUT_EXPRESSION);

		//定义通知,前后开启事务处理
		return new DefaultPointcutAdvisor(pointcut, txAdvice());
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring AOP声明式事务 的相关文章

随机推荐

  • Python-字符串的世界

    Python字符串的世界 在Python编程中 字符串 String 是一种非常重要的数据类型 用于表示文本信息 字符串可以包含字母 数字 特殊字符以及空格 它们在编程中被广泛用于文本处理 格式化输出 字符串匹配等各种场景 创建字符串 创建
  • PCB是什么?你真的足够了解PCB吗?

    在电子行业有一个关键的部件叫做PCB printed circuit board 印刷电路板 这是一个太基础的部件 导致很多人都很难解释到底什么是PCB 这篇文章将会详细解释PCB的构成 以及在PCB的领域里面常用的一些术语 在接下来的几页
  • C#进行图片压缩(对jpg压缩效果最好)

    直接上代码 1 public static class ImageCompress 2 3
  • 基于5g的交通运输_江苏交通全面开启“5G”加速

    江苏交通全面开启5G加速 2020年4月1日 江苏省交通运输厅 与三大运营商 江苏铁塔公司 签署5G战略合作协议 共推未来交通信息化 数字化 智能化发展 从中国高层的多次部署 到资本市场的资金热捧 近期最受舆论关注的概念之一莫过于 新基建
  • SQLserver中存储过程的应用

    在SQL中 存储过程类似于编程语言的函数 即当创建一个存储过程之后便可以在接下来任何类似的操作是直接调用存储过程 那么我们创建存储过程的优势是什么呢 1 提高性能 存储过程将SQL语句封装在一起 降低了数据传输的成本 减少执行时间 2 提高
  • 虚拟机栈的作用以及特点

    4 虚拟机栈 每个线程运行时所需要的内存 称为虚拟机栈 在jvm里 方法的临时储存是在栈里完成的 每个栈由多个栈帧 Frame 组成 对应着每次方法调用时所占用的内存 每个线程只能有一个活动栈帧 对应着当前正在执行的那个方法 正在运行的方法
  • React Draggable 实现拖拽

    React Draggable 是 react 生态中 最好用的拖拽实现库之一 如果你的应用中需要实现拖拽功能 可以尝试用 react draggable 它可以满足多数情况下的拖拽需求 比如一个弹出设置浮窗 可以相互遮挡的容器之类 在所有
  • 计算机2.0培训心得,信息技术应用能力提升培训心得体会两篇

    信息技术应用能力提升培训心得体会两篇 篇一 本月 我进行了 教师信息技术应用能力提升工程 的学习 学习过程中的每一天我都过得非常充实 这次的培训我学习到了很多 每一个视频的内容都非常有意义 有价值 所以 这段时间 我很认真的学习了此次的培训
  • 搭建Spark所遇过的坑

    一 经验 1 Spark Streaming包含三种计算模式 nonstate stateful window 2 kafka可通过配置文件使用自带的zookeeper集群 3 Spark一切操作归根结底是对RDD的操作 4 部署Spark
  • 2017-03-01-为你的Github生成漂亮的徽章和进度条

    原文来自为你的Github README生成漂亮的徽章和进度条 欢迎去博主的博客体验更好的阅读感受 github上常见的徽章标签和进度条 平时在上github的时候看到别人写的精美的README 我总是感到非常的羡慕 近来我也开始使用mar
  • qml 实现展示本地文件系统

    遍历本地文件 qt 提供了很多种便利类来实现本地的文件系统管理 比如QDirModel和QFileSystemModel qml中又提供了FolderListModel 需要包含Qt labs folderlistmodel 2 0 笔者的
  • 所有能反演SIF的卫星以及下载链接

    转载自科学网张园博客 http blog sciencenet cn blog 3430406 1223659 html 目录 SCIAMACHY GOME 2 GOSAT OCO 系列卫星 轨道碳观察者 TanSat TROPOMI 调研
  • 信息隐藏预测算法之MED

    MED median edge detector 第一次MED算法概念被提出的论文 http www hpl hp com techreports 98 HPL 98 193 pdf 下图为图像矩阵的一部分 用此为例来说明MED预测算法 其
  • 升级windows10

    前言 windows7已经被微软停更了 所以说 有些用户想升级到windows10 这篇文章 将会教你升级windows10 下载windows10最新安装包 有一个网址 建议大家收藏好 windwos10最新版本官网下载 点进去链接 往下
  • Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class

    From Java中泛型 Class
  • JavaScript Array 对象

    解释 Array 对象用于在变量中存储多个值 语法 var cars Saab Volvo BMW 第一个数组元素的索引值为 0 第二个索引值为 1 以此类推 数组属性 属性 描述 constructor 返回创建数组对象的原型函数 len
  • 数据库关系模型

    数据库关系模型和SQL 文章目录 数据库关系模型和SQL 安装 SQL语句 DCL DDL 关系 候选键 PRIMARY KEY 主键 Foreign KEY 外键 索引Index B 树 约束Constraint 数据库的三大完整性 域约
  • Lua(9) ——Cocos之_从C++过渡到Lua 文章不错 留下备查

    Lua 9 Cocos之 从C 过渡到Lua 唠叨 现在开始学习Lua了 开始用 Cocos Code IDE 开发cocos2dx的游戏了 可是呢 因为 cocos2dx v3 x 刚刚才出来不久 所以网上的教程大部分都是基于C 版本的
  • JNI 基础

    一 JNI 涉及的名词概念 1 1 JNI Java Native Interface 它是Java平台的一个特性 并不是Android系统特有的 实现Java代码调用C C 的代码 C C 的代码也可以调用Java的代码 1 2 二进制库
  • Spring AOP声明式事务

    Spring AOP声明式事务 Spring AOP声明式事务 传统spring配置 SpringBoot配置 Spring AOP声明式事务 Spring AOP声明式事务可以帮我们自动管理事务 在业务操作前后加入事务开始和提交 根据约定