用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 ...
随机推荐
- GPS位置显示在地图上
源码分析博客地址:https://blog.csdn.net/wuquan_1230/article/details/79614974 工具下载地址:http://download.csdn.net/ ...
- 009_go语言中的slices分片
代码演示 package main import "fmt" func main() { s := make([]string, 3) fmt.Println("emp: ...
- C语言学习笔记之输出缓冲
在c语言中经常用到输出函数printf,当我们像往常一样在输出函数中输入我们的想要的输出的东西后加\n换行 验证结果如我们输出的一样 如果我们在后面加入死循环会不会出现这些语句呢 结果卡死了,可还是输 ...
- (转载+新增)Win7下安装配置gVim
转载自 http://www.cnblogs.com/zhcncn/p/4151701.html.而后安装过程中加入自己遇到的问题解决方案. 本文根据vim官网的<Simple Steps to ...
- django python manage.py runserver 流程
python manage.py runserver 流程分析 版本 python27 django 1.0 搭建可运行的环境 创建python27 虚拟环境 github 下载 django-1.0 ...
- Spring Cloud 之分布式配置基础应用
分布式配置基础应用 配置中心服务 spring-config-server pom.xml <?xml version="1.0" encoding="UTF-8& ...
- PYTHON实战完整教程1-配置VSCode开发环境
一.安装 为降低学习门槛,保证学习目标的聚焦,我们在windows(使用WinServer2019虚拟机)上搭建开发环境.(系列教程最后结束时,也会部署到linux上) 打开Python官网 http ...
- Java 多态 接口继承等学习笔记
Super关键字 1.子类可以调用父类声明的构造方法 : 语法:在子类的构造方法中使用super关键字 super(参数列表) 2.操作被隐藏的成员变量(子类的成员变量和父类的成员变量重名的说法)和 ...
- spring boot-controller中的一个方法获取其他方法返回的值
@RequestMapping("/test") public String getData() { return "redirect:/other";} re ...
- java 多态二
一 多态-转型 多态的转型分为向上转型与向下转型两种: 向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程. 使用格式: 父类类型 变量名 = new 子类类型() ...