基于XML的声明式事务

场景模拟

参考基于注解的声明式事务

修改Spring的配置文件

将Spring配置文件中去掉tx:annotation-driven标签,并添加配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--    开启组件扫描--><context:component-scan base-package="com.yogurt.spring6.xmltx"></context:component-scan><!--    数据源对象 引入外部属性文件,创建数据源对象--><context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="url" value="${jdbc.url}"></property><property name="driverClassName" value="${jdbc.driver}"></property><property name="username" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property></bean><!--    JdbcTemplate对象--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="druidDataSource"></property></bean><!--    事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="druidDataSource"></property></bean><!--    配置事务增强--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="get*" read-only="true"/><tx:method name="update" read-only="false" propagation="REQUIRED"></tx:method><tx:method name="buy*" read-only="false" propagation="REQUIRED"></tx:method></tx:attributes></tx:advice><!--    配置切入点和通知使用的方法--><aop:config><aop:pointcut id="pt" expression="execution(* com.yogurt.spring6.xmltx.service.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pt"></aop:advisor></aop:config>
</beans>

Controller

@Controller
public class BookController {@Autowiredprivate BookService bookService;/*** 买书的方法* @param bookId* @param userId*/public void buyBook(Integer bookId,Integer userId){//调用Service方法bookService.buyBook(bookId,userId);}}

 Service

@Service
public class BookServiceImpl implements BookService {@Autowiredprivate BookDao bookDao;/*** 买书的方法* @param bookId* @param userId*/@Overridepublic void buyBook(Integer bookId, Integer userId) {//根据图书id查询图书价格Integer price = bookDao.getBookPriceByBookId(bookId);//更新图书库存量 -1bookDao.updateStock(bookId);//更新用户表用户余额 -图书价格bookDao.updateUserBalance(userId,price);}
}

Dao

@Repository
public class BookDaoImpl implements BookDao {@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 根据id查询图书价格* @param bookId* @return*/@Overridepublic Integer getBookPriceByBookId(Integer bookId) {String sql = "select price from t_book where book_id = ?";Integer price = jdbcTemplate.queryForObject(sql, Integer.class, bookId);return price;}/*** 更新库存信息* @param bookId*/@Overridepublic void updateStock(Integer bookId) {String sql = "update t_book set stock = stock -1 where book_id = ?";jdbcTemplate.update(sql,bookId);}/*** 更新用户表用户余额 -图书价格* @param userId* @param price*/@Overridepublic void updateUserBalance(Integer userId, Integer price) {String sql = "update t_user set balance = balance - ? where user_id = ?";jdbcTemplate.update(sql,price,userId);}
}

 测试:

@SpringJUnitConfig(locations = "classpath:beans-xml.xml")
public class TestBookTx {@Autowiredprivate BookController bookController;@Testpublic void testBuyBook(){bookController.buyBook(1,1);}}

某些小细节:

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

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

相关文章

RK3588平台开发系列讲解(项目篇)嵌入式AI的学习步骤

文章目录 一、嵌入式AI的学习步骤1.1、入门Linux1.2、入门AI 二、瑞芯微嵌入式AI2.1、瑞芯微的嵌入式AI关键词2.2、AI模型部署流程 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2; 本篇将给大家介绍什么是嵌入式AI。 一、嵌入…

PasswordPusher:能通过URL安全传递密码

什么是 Password Pusher &#xff1f; Password Pusher 是一个开源应用程序&#xff0c;用于通过网络安全的传递密码。在经过一定数量的查看和/或时间后&#xff0c;指向密码的链接会过期。 从功能上说&#xff0c;类似于 Bitwarden Send&#xff0c;思路上与传统阅后即焚工具一…

四、Ribbon负载均衡

目录 一、负载均衡流程 1、我通过浏览器直接访问userservice/user/1&#xff0c;无法访问&#xff0c;说明是负载均衡做了相应的处理 2、我们来看一下代码中负载均衡的流程是怎样的 3、图像流程 二、负载均衡策略 1、修改负载均衡策略 &#xff08;方式一&#xff09; &a…

docker 安装xxl-job

1.拉取镜像 docker pull xuxueli/xxl-job-admin:2.4.0 2.docker镜像创建并运行 docker run -e PARAMS"--spring.datasource.urljdbc:mysql://xxxxx:3306/xxl_job?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&serverTimezoneAsia/Shanghai&…

俄罗斯方块

一.准备工作 先创建一个新的Java项目命名为“俄罗斯方块”。再在该项目中创建一个文件夹命名为”images”&#xff0c;并将所需的图片素材拖入该文件夹。 二.代码呈现 编写小方块类&#xff1a; import java.awt.image.BufferedImage;/*** 描述:小方块类* 属性&#xff1a;…

Google 向中国开发者开放数百份 TensorFlow 资源

Google 的机器学习框架 TensorFlow 自 2015 年开源后&#xff0c;已然成为 AI 领域最受欢迎的框架。 据统计&#xff0c;在广受欢迎的 Python 编程语言在线软件知识库 PyPi 上&#xff0c;TensorFlow 的下载次数已超过 90 万&#xff0c;其中有 15% 来自中国。谷歌官方博客也表…

你是想被ChatGPT改变,还是改变软件开发的未来?丨IDCF

人工智能技术的发展&#xff0c;正在深刻地改变着我们的生活和工作方式。在软件工程领域&#xff0c;ChatGPT作为一种新兴的人工智能技术&#xff0c;正在逐渐地被应用到软件开发的各个环节中。那么&#xff0c;ChatGPT对每个人的影响是什么呢&#xff1f; 一、对软件开发人员…

从零搭建微服务架构:Spring Boot与Nacos完美整合

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 从零搭建微服务架构&#xff1a;Spring Boot与Nacos完美整合 前言第一&#xff1a;服务注册与发现第二&#xff1a;配置中心第三&#xff1a;报错问题解决第四&#xff1a;什…

自己搭设开源密码管理工具 bitwarden

简介 Bitwarden是一款自由且开源的密码管理服务&#xff0c;用户可在加密的保管库中存储敏感信息&#xff08;例如网站登录凭据&#xff09;。Bitwarden平台提供有多种客户端应用程序&#xff0c;包括网页用户界面、桌面应用&#xff0c;浏览器扩展、移动应用以及命令行界面。[…

247:vue+openlayers 根据坐标显示多边形(3857投影),计算出最大幅宽

第247个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中根据坐标显示多边形(3857投影),计算出最大幅宽。这里先通过Polygon来显示出多边形,利用getExtent() 获取3857坐标下的最大最小x,y值,通过ransformExtent转换坐标为4326, 通过turf的turf.distance和计算…

5、鸿蒙项目远程调试

一、注册华为账号&#xff0c; 如果是华为手机&#xff0c;并注册了账号可能跳过此步骤&#xff0c;如果使用邮箱注册&#xff0c;此邮箱一定是要正确的邮箱&#xff0c;此处需要使用邮箱获取验证码 注册地址&#xff1a;‎ 1、进入注册页面&#xff0c;输入手机号等信息后点…

系列二、类装载器ClassLoader

一、能干嘛 1.1、方法区 存放类的描述信息的地方。 1.2、JVM中的类装载器 1.3、获取ClassLoader的方式 /*** Author : 一叶浮萍归大海* Date: 2023/11/16 0:08* Description: 获取类的加载器的方式*/ public class ClassLoaderMainApp {public static void main(String[] arg…