Spring 之声明式事务和 Spring Junit 案例应用详解

(感谢您的关注和点赞支持!) 

Spring-test

在前面测试中,每次从spring 容器中获取 bean 都需要实例化 ApplicationContext ,相对麻烦,可以考虑使用 Spring-test 完成测试

Spring Test 是 Spring Framework 提供的一系列测试支持工具,它为开发者提供了在单元测试和集成测试中模拟 Spring 上下文、依赖注入(DI)和事务管理的能力

添加依赖

pom.xml

<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring-version}</version>
</dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.2</version>
</dependency>

编写测试类

在 src/test/java 下

编写测试类

需要使用 注解 @SpringJUnitConfig

  • xml 方式:

    @SpringJUnitConfig(locations = "classpath:spring.xml")
    public class SpringTestJunit5{}
  • 注解方式:

    @SpringJUnitConfig(SpringTestJunit5.class)
    @ComponentScan("com.wdzl.anno")
    public class SpringTestJunit5{}
    如果是全注解,则@SpringJUnitConfig 传入配置扫描注解的类

测试配中配置依赖

SpringTestJunit5

@SpringJUnitConfig(locations = "classpath:spring.xml")
public class SpringTestJunit {@Autowiredprivate EmpService empService;@Testpublic void test(){}
}

全注解方式:

@SpringJUnitConfig(SpringTestJunit5.class)
@ComponentScan("com.wdzl.anno")
public class SpringTestJunit5 {@Autowiredprivate BookService bookService;@Testpublic void testAOP(){bookService.save();}
}

三、声明式事务

声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一。 Spring的声明式事务顾名思义就是采用声明的方式来处理事务

编写转账业务代码

package com.wdzl.service;import com.wdzl.dao.IEmpDao;
import com.wdzl.pojo.Emp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service
public class EmpService {@Autowiredprivate IEmpDao empDao;public Emp get(Integer empno){return empDao.get(empno);}public List<Emp> queryAll(){return empDao.queryAll();}public void save(Emp emp){empDao.save(emp);}public void update(Emp emp){empDao.update(emp);}/*** 转账* @param fromId  转出账号* @param toId    转入账号* @param money   转账金额*/public void trans(Integer fromId,Integer toId,Float money){Emp fromEmp = get(fromId);Emp toEmp = get(toId);//内存修改fromEmp.setSalary(fromEmp.getSalary()-money);toEmp.setSalary(toEmp.getSalary()+money);// 持久化empDao.update(fromEmp);//假设异常
//        "".substring(9999);empDao.update(toEmp);}
}

写好后,正常测试,看是否在没有异常时能正常转账;

异常时,部分转账;出现不一致情况,并没回滚。

配置事务

两种常用方式

  • xml 配置
  • 注解

xml 配置方式

只需在spring 配置文件中修改

1. 配置事务管理器

依赖数据源,通过控制数据源来完成事务控制

<!--1. 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
2 . 配置 advice

注意:在idea中,配置 tx 命名空间时方法,敲入 <tx:advice> 自动提示,但是一定要注意,选择 tx 的命名空间,

不要选择 cache !!!!!!!!!

<tx:advice id="txadvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="tra*" propagation="REQUIRED" /><tx:method name="*" propagation="SUPPORTS"/></tx:attributes>
</tx:advice>
  • propagation 事务的传播行为:
    • REQUIRED : 必须在事务中,如果方法执行时,已经在事务中,则继续使用当前事务;如果没有事务,则重新打开新的事务
    • SUPPORTS : 支持当前事务状态,如果在事务中,则执行当前事务。如果没有,不会新开启事务
    • REQUIRES_NEW : 每次都会重新开启新的事务
3. aop 配置
<aop:config><aop:pointcut id="xx" expression="execution(public * com.wdzl.service..*.*(..))"/><aop:advisor advice-ref="txadvice" pointcut-ref="xx"/>
</aop:config>

注意:上面配置,需要注入前面的 advice 和 切入点 id

4. 测试

通过上面配置,不需要修改任何代码的,直接正常测试调用就可以了

@SpringJUnitConfig(locations = "classpath:spring.xml")
public class SpringTestJunit {@Autowiredprivate EmpService empService;@Testpublic void test(){empService.trans(1,2,500);}
}

注解配置方式

1. 配置事务管理器

在 spring.xml 中配置

<!--1. 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
2. 开启声明式事务注解
<!--2.启用声明式事务注解-->
<tx:annotation-driven/>
3. 方法标注注解

在需要事务支持的方法标注注解 @Transactional

    @Transactional/*** 转账* @param fromId  转出账号* @param toId    转入账号* @param money   转账金额*/public void trans(Integer fromId,Integer toId,Float money){Emp fromEmp = get(fromId);Emp toEmp = get(toId);//内存修改fromEmp.setSalary(fromEmp.getSalary()-money);toEmp.setSalary(toEmp.getSalary()+money);// 持久化empDao.update(fromEmp);//假设异常
//        "".substring(9999);empDao.update(toEmp);}
}
4. 测试
@SpringJUnitConfig(SpringTestJunit5.class)
@ComponentScan("com.wdzl.anno")
public class SpringTestJunit5 {@Autowiredprivate EmpService empService;@Testpublic void testAOP(){empService.trans(1,2,500);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jackson 2.x 系列【3】解析器 JsonParser

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 解析原理3. 案例演示3.1 创建 JsonParser3.2 解析3.3 读取3.4 测试 1. 前…

水果软件FL Studio 21 for mac 21.2.3.3586破解版的最新版本2024介绍安装

音乐是人类最美好的语言&#xff0c;它能够跨越国界、文化和语言&#xff0c;将人们紧密地联系在一起。在当今数字化时代&#xff0c;音乐创作已经不再是专业人士的专利&#xff0c;越来越多的音乐爱好者开始尝试自己动手制作音乐。而FL Studio21中文版编曲软件正是这样一个为你…

Elasticsearch8搭建及Springboot中集成使用

1.搭建 1.1.下载地址 Elasticsearch&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch Kibana&#xff1a;https://www.elastic.co/cn/downloads/kibana 1.2.具体过程 下载安装包&#xff1a;访问上述链接&#xff0c;下载适合你操作系统的Elasticsearch和Ki…

PyTorch 深度学习(GPT 重译)(五)

十二、通过指标和增强改进训练 本章涵盖 定义和计算精确率、召回率以及真/假阳性/阴性 使用 F1 分数与其他质量指标 平衡和增强数据以减少过拟合 使用 TensorBoard 绘制质量指标图 上一章的结束让我们陷入了困境。虽然我们能够将深度学习项目的机制放置好&#xff0c;但实…

故障诊断 | 一文解决,GRNN广义回归神经网络的故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,GRNN广义回归神经网络的故障诊断(Matlab) 专栏介绍

TinTin Web3 Bounty 挑战杯开启,Sui 向你发出挑战邀请

以下文章来源于TinTinLand &#xff0c;作者TinTinLand。 2024 年开年最火的是什么&#xff1f; 对 Web3 来说&#xff0c;Bounty 任务应该是普通人获得行业“一杯羹”的重要捷径&#xff01; 通过深入学习各类 Web3 技术&#xff0c;凭借实战锻炼开发创新项目&#xff0c;就…

【python】【多线程】巧用Python 实现多线程批量将 Word 文档转换为PDF格式

以下是使用 Python 实现多线程批量将 doc 文档转换为 PDF 格式的示例代码: import os import threading import win32com.client from time import sleepclass DocToPdfThread(threading.Thread):def __init__(self, doc_file, output_dir):threading.Thread.__init__(self)se…

#微信小程序:微信小程序常见的配置传旨

微信小程序 app.js 设置全局的基础数据 通过 let app getApp() 获取里面的数据 app.json 设置tab,注册页面的路由 app.wxss 公共的样式&#xff0c;引入iconfont project.config.json 项目配置文件&#xff0c;用的最多就是配置是否开启https校验 pages 包含一个个…

Linux CentOS 7.6安装mysql5.7.26详细保姆级教程

一、通过wget下载mysql安装包 1、下载 //进入home目录 cd /home //下载mysql压缩包 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz //解压 tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz //重命名文件夹 mv mys…

MongoDB系列之查询计划

概述 一个查询具体如何被执行的过程&#xff0c;称为查询计划。MongoDB采用自底向上的方式来构造查询计划&#xff0c;每一个查询计划&#xff08;query plan&#xff09;都会被分解为若干个有层次的阶段&#xff08;stage&#xff09;。整个查询计划最终会呈现出一颗多叉树。…

ReaLTaiizor开源.NET winform控件库学习使用

一、ReaLTaiizor项目介绍 1.1 介绍及地址 基于MIT license开源、免费、美观的.NET WinForm UI控件库&#xff1a;ReaLTaiizor ReaLTaiizor是一个开源免费的.NET WinForms控件库&#xff0c;它提供了广泛的组件和丰富的主题选项&#xff08;用户友好、注重设计&#xff09;&am…

提供数字免疫力:采取整体方法来优化您的网络

采用数字技术已成为许多美国企业的关键竞争优势&#xff0c;导致其在与新部署的云解决方案的安全连接方面的投资不断增加。然而&#xff0c;随着越来越多的关键应用程序迁移到云端&#xff0c;公司保护其敏感数据和资源变得更具挑战性&#xff0c;因为这些资产现在超出了内部防…

C#中Console.WriteLine()函数输出格式详解

格式项都采用如下形式&#xff1a; {index[,alignment][:formatString]} 其中"index"指索引占位符&#xff0c;这个肯定都知道&#xff1b; “,alignment"按字面意思显然是对齐方式,以”,"为标记&#xff1b; “:formatString"就是对输出格式的限…

js读取本地 excel文件、txt文件的内容

<input type"file" change"fileChange"> 1、txt文件 fileChange(event) {console.log(fileChange, event)const file event.target.files[0];const reader new FileReader();reader.readAsText(file);reader.onload function(e) {console.log(r…

基于SpringBoot的学生成绩管理系统

基于SpringBootVue的家教管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 系统功能结构展示 登录界面图 现今&#xff0c;越来越多的人乐于选择一项合适的管理方案&#xff0c;但是普通用户往往受到管理经验地限制&…

ES 常见面试题及答案

目录 es 写入数据流程 es 删除数据流程 es 读数据流程 es 部署的服务有哪些角色 es 的实现原理 es 和lucence 关系 如何提高写入效率 提高搜索效率 es doc value指的啥 分片指的啥&#xff0c;定义后可不可义再修改 深分页如何优化 对于聚合操作是如何优化的 元数据…

面试九 设计模式

单例模式通常被归类为创建型设计模式&#xff0c;因为它主要关注如何创建对象的实例&#xff0c;以及如何确保在整个应用程序生命周期中只有一个实例存在。 1.为什么日志模块和数据库连接池需要单例模式 使用单例模式来实现数据库连接池主要有以下几个原因&#xff1a; 全局唯…

[自研开源] MyData 数据集成之任务调度模式 v0.7

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;http://demo.mydata.work 交流 Q 群&#xff1a;430089673 概述 本…

四、Elasticsearch 进阶

自定义目录 4.1 核心概念4.1.1 索引&#xff08;Index&#xff09;4.1.2 类型&#xff08;Type&#xff09;4.1.3 文档&#xff08;Document&#xff09;4.1.3 字段&#xff08;Field&#xff09;4.1.5 映射&#xff08;Mapping&#xff09;4.1.6 分片&#xff08;Shards&#…

富格林:正视安全平台阻挠亏损

富格林悉知&#xff0c;当前不少投资者都意识到一款正规的平台能够帮助我们阻挠亏损确保安全。因此不少投资者在选择都会参考一些排行榜。但是网上这方面的榜单眼花缭乱&#xff0c;新手投资者可能难以从中挑选到能够帮助我们阻挠亏损确保安全的平台。下面富格林将给大家提供一…