用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分。希望大家多多支持!!!

转载于:https://www.cnblogs.com/xiaofeng88/p/10317344.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值