用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 ...
随机推荐
- P6222 「简单题」加强版 莫比乌斯反演 线性筛积性函数
LINK:简单题 以前写过弱化版的 不过那个实现过于垃圾 少预处理了一个东西. 这里写一个实现比较精细了. 最后可推出式子:\(\sum_{T=1}^nsum(\frac{n}{T})\sum_{x| ...
- [转]17个常用的JVM参数
作者:SimpleSmile_5177 来源:https://www.cnblogs.com/Simple-Object/p/10272326.html 前言 大家都知道,jvm在启动的时候,会执行默 ...
- Spring bean作用范围
1,singleton Spring ioc 容器中仅有一个 Bean 实例,Bean 以单例的方式存在:2,prototype 每次从容器中调用 Bean 时,都返回一个新的实例:3,request ...
- ipa包如何打包?ios打包ipa的四种方法分享
今天带来的内容是ios打包ipa的四种方法.总结一下,目前.app包转为.ipa包的方法有以下几种,下面一起来看看吧! 1.Apple推荐的方式,即实用xcode的archive功能 Xco ...
- centos,linux环境下安装JDK1.8完整
进入oracle官网下载安装包,cetos一般选择xx-xx-linux-x64.tar.gz.获取到地址后可以点击下载,也可以使用wget命令下载. 在得到下载好的文件后下面就可以开始安装了.比如我 ...
- mac 教你如何在Mac上搭建自己的服务器——Nginx
WHAT 本篇主要是基于Nginx在Mac上搭建自己的服务器. 我相信很多朋友肯定是第一次听到Nginx,关于它具有怎样的传奇,这儿肯定说不完也说不透. 有兴趣的朋友可以自行google或者baidu ...
- Java语言程序设计2019.9.16
1.Java的基本运行单位是类. 2.类是由方法和变量组成. 3.变量类型分为byte,int,double,long,short,boolean,char,float.java中整数类型默认的int ...
- C语言学习笔记之原码反码补码
原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0 0变1 补码:机器 ...
- C#设计模式之5-单例模式
单例模式(Singleton Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/397 访问. 单例模式属 ...
- 《闲扯Redis十》Redis 跳跃表的结构实现
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...