用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 ...
随机推荐
- JS&ES6学习笔记(持续更新)
ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...
- SpringBoot集成Elasticsearch7.6
前言: 本文不赘述Elasticsearch的相关基础知识点和部署,只介绍如何在SpringBoot如何集成Elasticsearch并进行数据操作 Spring Data项目中提供了操作es的框架S ...
- 【六省联考2017】组合数问题 题解(矩阵快速幂优化DP)
题目链接 题目大意:求$(\sum\limits_{i=0}^n C_{nk}^{ik+r})\ mod \ p$的值. --------------------- 讲真,一开始看到这个题我都没往DP ...
- Kaggle-pandas(6)
Renaming-and-combining 教程 通常,数据会以列名,索引名或我们不满意的其他命名约定提供给我们. 在这种情况下,您将学习如何使用pandas函数将有问题的条目的名称更改为更好的名称 ...
- JS 前端框架笔记
Swiper轮播图插件使用 官网:https://www.swiper.com.cn/ 先引用插件的css.js文件 然后找到需要使用的轮播图文件中去把HTML css和JS代 ...
- 【av68676164(p55-p58)】 Intel CPU和Linux内存管理
7.4.1 Intel CPU物理结构 https://www.cnblogs.com/megachen/p/9768115.html x86实模式 实模式 20位:1M内存空间 地址表示方式:段地址 ...
- Unity 入门
- 智能问答中的NLU意图识别流程梳理
NLU意图识别的流程说明 基于智能问答的业务流程,所谓的NLU意图识别就是针对已知的训练语料(如语料格式为\((x,y)\)格式的元组列表,其中\(x\)为训练语料,\(y\)为期望输出类别或者称为意 ...
- Vue watch 深层监听
Vue中监听某个对象的属性 为了避免监听整个对象导致效率问题,可以监听某个对象的特定属性 watch: { 'deptModel.depts': { handler(newVal, oldVal) { ...
- Pandas和常见数据处理小模块
文章目录 前言 Pandas部分 根据某一列找另一列 根据条件变换每一列 按照标签保存为DataFrame 数据处理 切分数据集和测试集 其他 计时 前言 pandas 确实很好用, 但是网上的教程参 ...