spring中事务的aop实现

spring中事务的aop实现

在上一篇博客中我介绍了spring中aop的实现原理,同时也使用了service中的事务,但是都只是打印语句,并没有具体的实现,现在我把实现了的具体代码也提供出来。可以更好的理解aop
(1)、导包

(2)、创建表

(3)、写实体类以及service、dao
Account.java
public class Account {
	private Integer id;
	private String name;
	private Double money;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Double getMoney() {
		return money;
	}
	public void setMoney(Double money) {
		this.money = money;
	}
	

}
AccountService.java
public interface AccountService {
	//转账
	void tranfer(int from,int to,double money);
}
AccountServiceImpl.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.haha.dao.AccountDao;
public class AccountServiceImpl implements AccountService {
	@Autowired
	private AccountDao accountDao;
	public void setAccountDao(AccountDao accountDao) {
		this.accountDao = accountDao;
	}

	@Override
	public void tranfer(int from, int to, double money) {
		accountDao.fromMoney(from, money);
		//int i=1/0;
		accountDao.toMoney(to, money);
		System.out.println("转账成功");
	}

}
AccountDao.java
public interface AccountDao {
	//减钱
	void fromMoney(int from,double money);
	//加钱
	void toMoney(int to,double money);

}
AccountDaoImpl.java
import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class AccountdaoImpl extends JdbcDaoSupport implements AccountDao {
	//减钱
	@Override
	public void fromMoney(int from, double money) {
		String sql="update account set  money=money-? where id=?";
		getJdbcTemplate().update(sql,money,from);

	}
	//加钱
	@Override
	public void toMoney(int to, double money) {
		String sql="update account set  money=money+? where id=?";
		getJdbcTemplate().update(sql,money,to);
	}

}
(4)、配置文件
applicationContext2.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
	
	<!--引入c3p0  -->
	<context:property-placeholder location="classpath:db.properties"/>
	
	<!--配置c3p0连接池  -->
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driverClass}"/>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
		<property name="user" value="${jdbc.user}"/>
		<property name="password" value="${jdbc.password}"/>
	</bean>
	<!--注入dao  -->
	<bean name="accountDao" class="com.haha.dao.AccountdaoImpl">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	<!--注入Service  -->
	<bean name="accountService" class="com.haha.service.AccountServiceImpl">
		<property name="accountDao" ref="accountDao"/>
	</bean>
	
	<!--配置事务管理器  -->
	<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 配置事务通知
		id:给通知起个名字
		transaction-manager:指定事务管理器是哪个
	 -->
	<tx:advice id="myAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!--
				name:方法名,save*表示以save开头的任何方法
				isolation:隔离级别
				read-only:只读
				propagation:传播行为
			  -->
			<tx:method name="save*" isolation="REPEATABLE_READ" read-only="false" propagation="REQUIRED"/>
			<tx:method name="delect*" isolation="REPEATABLE_READ" read-only="false" propagation="REQUIRED"/>
			<tx:method name="*" isolation="REPEATABLE_READ" read-only="false" propagation="REQUIRED"/>
		</tx:attributes>
	</tx:advice>
	
	<!-- 配置织入 -->
	<aop:config>
		<!--配置切点  -->
		<aop:pointcut expression="execution(* com.haha.service.*ServiceImpl.*(..))" id="txPC"/>
		<!--配置切面 =通知+切点 -->
		<aop:advisor advice-ref="myAdvice" pointcut-ref="txPC"/>
	</aop:config>
	
</beans>
(5)、测试
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.haha.service.AccountService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class test2 {
	@Autowired
	private AccountService accountService;

	public void setAccountService(AccountService accountService) {
		this.accountService = accountService;
	}
	@Test
	public void fun(){
		accountService.tranfer(1, 2, 100);
	}
	

}
如果在转账的过程没有出现异常,它会正常执行,如果在转账的过程中出现了异常,导致转账只完成了一半,这个时候它会rollback,事务会回滚。







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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值