用aop去解决事物问题(tx)记录学习之aop1.2
上一个文章我们了解了什么事aop,以及aop的使用方法,主要是把自己想要加入的通知(advice)加入到我们的方法里,
比如上一章我们说的事把myadvice类中的before方法织入到userservice类中的savedata方法里,因为用的是before,根据applicationContext.xml配置,before方法用的<aop:before … />,所以在执行userservice方法时会调用before方法。
下面这一章主要是讲解一下aop和tx联合使用的两种方法
所涉及到知识点:
- Spring读取db.properties,在配置文件中连接jdbc(新知识)
- Spring的事务管理器以及事物模板配置(新知识)
- Spring的bean配置
- Spring 的aop aop:advisor方法1(新知识) 之前用的是aop:aspect
- Spring的aop方法2 (新)使用tx:annotation-driven/以及注解
读取db.properties
相比大家都知道现在企业中的项目基本上为了更换数据库方便,都使用了一个properties文件写数据库的信息,
那么需要用到什么东西呢?
首先需要Spring的context的约束导入
在配置文件中加入以下配置
<context:property-placeholder location="classpath:db.properties"/>
以上代码系统就会扫描到db.properties,然后根据键值对配置。
以下是db.properties配置
jdbc.jdbcUrl=jdbc:mysql:///springtest
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=xiaofeng
jdbc.password=xiaofeng
配置文件配置(applicationContext.xml)需要用到c3p0中的连接池combo---com.mchange.v2.c3p0.ComboPooledDataSource
<context:property-placeholder location="classpath:db.properties"/>
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
jdbc模板
上面说的dataSource是用与连接数据库的连接池,但是其中还需要jdbc模板去管理他,因此我们需要在容器中声明jdbc模板,并将dataSource加入到jdbc模板中。因为jdbc模板中含有数据库中的增删改查的方法,我们需要调用它。
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
之后我们如果在Dao层中调用jdbcTemplate中的方法,那么我们需要在Dao添加属性jdbcTemplate。
比如
<bean name="userDao" class="cn.tsu.junittx.UserDaoImpl">
<property name="jt" ref="jdbcTemplate"></property>
</bean>
此时我们就可以在Dao层声明jdbcTemplate(注意记得加入set方法)调用数据库的方法
但是此时就有一个问题,那就是事务的问题,一旦语法错误,造成损失,比如银行转账,下面我们就联合事务再一起说一下。
Spring的事务管理器以及事物模板配置
如果要把Spring中的事务加入进来的话,我们就应该先了解一下事务的底层调用。它需要什么支持
- 事务管理transactionManager
- 事务模板对象transactionTemplate
事务模板中需要依赖事务管理,事务管理需要依赖注入数据源dataSource
首先先注入transactionManager事务管理
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
然后再注入transactionTemplate事务模板对象,依赖注入transactionManager
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
此时Spring有两种方法进行事务管理
方法一(需要配置的多,比较麻烦)
把transactionTemplate给我们的事务使用<tx:advice transaction-manager=“transactionManager”>
<aop:config>
<aop:pointcut expression="execution(* cn.tsu.junittx.*Service.*(..))" id="txpc"/>
<aop:advisor advice-ref="myAdvice" pointcut-ref="txpc"/>
</aop:config>
<tx:advice transaction-manager="transactionManager" id="myAdvice">
<tx:attributes>
<tx:method name="update*" isolation="REPEATABLE_READ" read-only="false" propagation="REQUIRED"/>
<tx:method name="transf" isolation="REPEATABLE_READ" read-only="false" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
以上的大致意思为 :把id名的myAdvice 的通知(此通知已写好,用的是事务管理对象)织入到id为txpc的类中,类中的方法需要与name=“ ”一致或者表达式一致。
方法二
配置文件中直接输入
<tx:annotation-driven/>
然后再去我们需要添加事务的类名上面(方法一中用的是匹配表达式查询该类方法)添加注解,也可以在方法上添加注解
import javax.annotation.Resource;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/ * 与配置文件中的<tx:annotation-driven/>联合使用*/
@Transactional(isolation=Isolation.REPEATABLE_READ,readOnly=false,propagation=Propagation.REQUIRED)
public class UserService {
@Resource(name="userDao")
private UserDaoImpl ud ;
public void transf(int from ,int to , double money) {
//减钱
ud.decreasemoney(from, money);
int i = 1 / 0;
//加钱
ud.increasemoney(to, money);
}
}
下面把源代码也发给大家,供新人参考学习
包名说明

学习下载链接:,也不贵,就1分。希望大家多多支持!!!
用aop去解决事物问题(tx)记录学习之aop1.2的更多相关文章
- QTableView另类打印解决方案(复用render函数去解决print问题)
Qt QTableView另类打印解决方案 上回书说道Qt的model/view,我就做了个demo用于显示数据库中的内容.没想到tableview的打印竟然成了问题.我困惑了,难道Qt不应该 ...
- Spring aop切面插入事物回滚
<!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...
- 运用Spring Aop,一个注解实现日志记录
运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...
- zepto | 用事件委托去解决无法给新增添的DOM添加事件的问题
前段时间在做一个任务的时候,碰见了一个问题:zepto无法用on事件去监听新增加的dom事件.这个问题用live可解决, 但是live在ios下失效,为了解决这个问题,我采用了暴力的方法去解决,每次添 ...
- 开始记录学习java的笔记
今天开始记录学习java的笔记,加油
- 解决一则enq: TX – row lock contention的性能故障
上周二早上,收到项目组的一封邮件: 早上联代以下时间点用户有反馈EDI导入"假死",我们跟踪了EDI导入服务,服务是正常在跑,可能是处理的慢所以用户感觉是"假死" ...
- Spring定义事物通知tx:advice
<aop:config proxy-target-class="false"> <aop:advisor advice-ref="txAdvice ...
- 面向切面编程AOP——加锁、cache、logging、trace、同步等这些较通用的操作,如果都写一个类,则每个用到这些功能的类使用多继承非常难看,AOP就是解决这个问题的,python AOP就是装饰器
面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java中myba ...
- SpringCloud或SpringBoot+Mybatis-Plus利用AOP+mybatis插件实现数据操作记录及更新对比
引文 本文主要介绍如何使用Spring AOP + mybatis插件实现拦截数据库操作并根据不同需求进行数据对比分析,主要适用于系统中需要对数据操作进行记录.在更新数据时准确记录更新字段 核心:AO ...
随机推荐
- CF 题目选做
写省选的题目对noip没什么大用 关键是 细节题或者是思考题比较重要 练思维自然是CF比较好了 把我见到的比较好的CF题放上来刷一刷. LINK:Complete the projects 就是说一个 ...
- 问题记录,php webserver端跨子域setcookie后浏览器不存
如题. path已设置成/,domain也已指定成父级域名,数据包response中可见Set-Cookie header为期望的cookie数据,但浏览器就是不接收.存储该cookie, 浏览器端也 ...
- 【可视化-2】将图像当作DSM进行三维显示
上一篇文章中,已经跳出颜色或者亮度的局限,将图像视作一般化的栅格数据,并提供了四种利用颜色和亮度来直观表示栅格间取值差异的可视化方法. 栅格数据的四种可视化方式 这一回,我们又要从一般化走向特殊化.栅 ...
- python4.4模块
import random #import导入,random随机数模块a=random.random() ...
- Qt信号参数中使用QVariantList时编译问题
今天调试代码时遇到一个奇怪的问题,不过一般感觉比较奇怪的问题,最后查到原因时,原因都比较简单! 编译问题 先来看一下qt的编译错误,提示一堆错误: In file included from D:\Q ...
- 补充的javascript 数据类型笔记
<p> 变量名命名规范</p> 由字母,数字,下划线,$组成 严格区分大小写 var app和var App 是两个变量 变量名不能以数字开头 ...
- [vue]子组件通过props获取父组件数据以及使用watch解决动态数据不生效问题
父子组件的传值,在Vue官方也写得很清楚,父组件中使用v-bind绑定传送,子组件使用props接收. 父组件通过v-bind绑定数据: <template> <router-vie ...
- 关于GPU你必须知道的基本知识
图形处理单元(或简称GPU)会负责处理从PC内部传送到所连接显示器的所有内容,无论你在玩游戏.编辑视频或只是盯着桌面的壁纸,所有显示器中显示的图像都是由GPU进行渲染的. 对普通用户来说,实际上不需要 ...
- C#LeetCode刷题之#160-相交链表(Intersection of Two Linked Lists)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3824 访问. 编写一个程序,找到两个单链表相交的起始节点. 例如 ...
- C#LeetCode刷题之#594-最长和谐子序列(Longest Harmonious Subsequence)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3800 访问. 和谐数组是指一个数组里元素的最大值和最小值之间的差 ...