当前位置: 首页 > news >正文

使用Spring事务管理和集成JUnit测试

Spring事务管理分为编程式事务声明式事务,但是编程式事务过于复杂并且具有高度耦合性,违背了Spring框架的设计初衷,因此这里只用声明式事务,声明式事务是基于AOP实现的

只需要在配置类添加`@EnableTransactionManagement`注解即可开启Spring的事务支持。接着,需要把一个事务要做的所有事情封装到Service层的一个方法中即可,并在配置文件中注册一个新的Bean,事务需要执行必须有一个事务管理器

@Bean

public TransactionManager transactionManager(@Autowired DataSource dataSource){

    return new DataSourceTransactionManager(dataSource);

}

编写Mapper操作和业务层的接口,再来编写业务层的实现,我们可以直接将其注册为Bean,交给Spring来进行管理,这样就可以自动将Mapper注入到类中了,并且可以支持事务,只需在方法上添加`@Transactional`注解,即可表示此方法执行的是一个事务操作,在调用此方法时,Spring会通过AOP机制为其进行增强,一旦发现异常,事务会自动回滚。

@Component
public class TestServiceImpl implements TestService{

    @Resource
    TestMapper mapper;

    @Transactional
    @Override
    public void test() {
        mapper.insertStudent();
        mapper.insertStudent();
    }
}

@Transactional`注解的参数

* transactionManager:指定事务管理器

* propagation:事务传播规则,一个事务可以包括N个子事务

* isolation:事务隔离级别

* timeout:事务超时时间

* readOnly:是否为只读事务,不同的数据库会根据只读属性进行优化,比如MySQL一旦声明事务为只读,那么久不允许增删改操作了。

* rollbackFor和noRollbackFor:发生指定异常时回滚或是不回滚,默认发生任何异常都回滚

事务传播一共有七种级别,Spring默认的传播级别是`PROPAGATION_REQUIRED`

 

集成JUnit测试

Spring为我们提供了一个Test模块,它会自动集成Junit进行测试

依赖

<dependency>

    <groupId>org.junit.jupiter</groupId>

    <artifactId>junit-jupiter</artifactId>

    <version>5.8.1</version>

    <scope>test</scope>

</dependency>

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-test</artifactId>

    <version>5.3.12</version>

</dependency>

然后直接在测试类上添加两个注解就可以搞定

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class TestMain {

    @Autowired
    TestService service;
    
    @Test
    public void test(){
        service.test();
    }
}

`@ExtendWith`是由JUnit提供的注解,等同于旧版本的`@RunWith`注解,然后使用SpringTest模块提供的`@ContextConfiguration`注解来表示要加载哪一个配置文件,可以是XML文件也可以是类,配置完成后,我们可以直接使用`@Autowired`来进行依赖注入,并且直接在测试方法中使用注入的Bean

相关文章:

  • 数据可视化:基于 Echarts + Python Flask 的动态实时大屏监管系统【源码】
  • T型电阻网络噪声分析
  • Happens-before原则
  • 【毕业设计】 基于单片机的放松按摩仪设计与实现 - 物联网 嵌入式 stm32
  • 基于springboot,vue校园点餐系统
  • qmake 文件扩展名操作
  • 【javaweb简单教程】9.Servlet与过滤器超简单教程
  • 猛淦,阿里大老纯手撸Spring高级源码手册,啃起来真TM香啊
  • ES6导入与导出(module)
  • 【opencv-c++】cv::imshow和cv::waitKey函数显示图像
  • 第二课 我的第一个程序 hello world
  • 消息队列实现分布式事务
  • 前端性能优化指标 + 检测工具
  • CubeMx笔记 --pwm输出+输入捕获
  • 轻松玩转树莓派Pico之一、新手上路
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 230. Kth Smallest Element in a BST
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • CAP 一致性协议及应用解析
  • java8-模拟hadoop
  • javascript从右向左截取指定位数字符的3种方法
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • magento 货币换算
  • Netty源码解析1-Buffer
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Spark学习笔记之相关记录
  • windows-nginx-https-本地配置
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 机器学习 vs. 深度学习
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 那些年我们用过的显示性能指标
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 正则表达式小结
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #Z2294. 打印树的直径
  • ${factoryList }后面有空格不影响
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .Net Core缓存组件(MemoryCache)源码解析
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [.net]官方水晶报表的使用以演示下载
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [Android]Tool-Systrace
  • [BUG] Authentication Error
  • [C++]——带你学习类和对象