【Spring】AOP事务演示

一、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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
	
<!-- 	指定spring读取properties配置
 -->	<context:property-placeholder location="classpath:db.properties"/>
	
	<!-- 三步完成spring中配置依赖关系 -->
	<!-- 1.将连接池放入Spring容器 -->
<!-- 	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="jdbcUrl" value="jdbc:mysql:///day01"></property>
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="user" value="root"></property>
		<property name="password" value="123456"></property>
	</bean> -->
	<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> 
	
	
	
	
 	<!-- 2.将JDBCTemplete放入Spring容器 -->
<!-- 	<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>  -->
	
	<!-- 3.将userdao放入spring容器 -->
	<bean name="userDaoImpl" class="com.aitiman.dao.UserDaoImpl">
<!-- 		<property name="jt" ref="jdbcTemplate"></property>
 -->		<property name="dataSource" ref="dataSource"></property>		
	</bean>
	
 	<bean name="accountDaoImpl" class="com.aitiman.dao.AccountDaoImpl">
		<property name="dataSource" ref="dataSource"></property>			
	</bean>
	
	<!-- 事务核心管理器,封装了所有事务操作,依赖于连接池 -->
	<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 事务模版对象 -->
	<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
		<property name="transactionManager" ref="transactionManager"></property>
	</bean>
	
	<!-- service -->
	<bean name="accountServiceImpl" class="com.aitiman.service.AccountServiceImpl">
		<property name="tt" ref="transactionTemplate"></property>
		<property name="ad" ref="accountDaoImpl"></property>
	</bean> 
	
	
	<!-- 配置事务通知 -->
	<tx:advice id="txAdvice"  transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="transfer" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
			<!-- 加*号可以通配方法 -->
			<tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
			<tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
			<tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED" read-only="true" />
			<tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED" read-only="true" />
			<tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
			<tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
			<tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
			<tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
		</tx:attributes>
	</tx:advice>
	
	<!-- 配置织入 -->
	<aop:config>
		<aop:pointcut expression="execution(* com.aitiman.service.*ServiceImpl.*(..))" id="txPC"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPC"/>
	</aop:config>
	
	<!-- 开启使用注解管理AOP事务,就不用配置上面的事务管理和织入了-->
	<tx:annotation-driven/>
	
</beans>

二、Dao层

package com.aitiman.service;

import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import com.aitiman.dao.AccountDao;

public class AccountServiceImpl implements AccountService {
	private AccountDao ad;
	private TransactionTemplate tt;
	
	//使用注解做事务管理,以下注解也可以加在类上,加在类上就是全局的
	@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
	public void transfer(Integer from, Integer to, Double money) {

		ad.inMoney(to, money);
		//制造异常
		//int i = 1/0;
		ad.outMoney(from, money);
	
	}

	
	//不用注解做事务管理
/*	public void transfer(Integer from, Integer to, Double money) {

				ad.inMoney(to, money);
				//制造异常
				//int i = 1/0;
				ad.outMoney(from, money);
			
	}*/
	
	
	//代码的方式进行事务管理
/*	@Override
	public void transfer(Integer from, Integer to, Double money) {
		tt.execute(new TransactionCallbackWithoutResult() {
			
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus arg0) {
				ad.inMoney(to, money);
				ad.outMoney(from, money);
			}
		});
	}*/
	
	
	public void setAd(AccountDao ad) {
		this.ad = ad;
	}

	public void setTt(TransactionTemplate tt) {
		this.tt = tt;
	}


}

三、service层

package com.aitiman.service;

import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import com.aitiman.dao.AccountDao;

public class AccountServiceImpl implements AccountService {
	private AccountDao ad;
	private TransactionTemplate tt;
	
	//使用注解做事务管理,以下注解也可以加在类上,加在类上就是全局的
	@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
	public void transfer(Integer from, Integer to, Double money) {

		ad.inMoney(to, money);
		//制造异常
		//int i = 1/0;
		ad.outMoney(from, money);
	
	}

	
	//不用注解做事务管理
/*	public void transfer(Integer from, Integer to, Double money) {

				ad.inMoney(to, money);
				//制造异常
				//int i = 1/0;
				ad.outMoney(from, money);
			
	}*/
	
	
	//代码的方式进行事务管理
/*	@Override
	public void transfer(Integer from, Integer to, Double money) {
		tt.execute(new TransactionCallbackWithoutResult() {
			
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus arg0) {
				ad.inMoney(to, money);
				ad.outMoney(from, money);
			}
		});
	}*/
	
	
	public void setAd(AccountDao ad) {
		this.ad = ad;
	}

	public void setTt(TransactionTemplate tt) {
		this.tt = tt;
	}


}

四、测试类

package com.aitiman.test;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.aitiman.service.AccountService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test03 {
	
	@Resource(name="accountServiceImpl")
	private AccountService as;
	
	@Test
	public void function() {
		as.transfer(1, 2, 100d);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring 中,可以使用 AOP(面向切面编程)和声明式事务管理来管理事务。 在声明式事务管理中,可以使用 @Transactional 注解来标记希望进行事务管理的方法或类。该注解可以用于类级别或方法级别,并且可以设置不同的传播行为、隔离级别和超时等属性。当使用 @Transactional 注解时,Spring 会自动为被标记的方法或类创建代理对象,在代理对象中添加事务管理的代码。 例如,以下代码演示了如何在 Spring 中使用声明式事务管理: ```java @Service @Transactional public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public void transferMoney(String fromUser, String toUser, double amount) { User from = userDao.getUserByName(fromUser); User to = userDao.getUserByName(toUser); from.setBalance(from.getBalance() - amount); to.setBalance(to.getBalance() + amount); userDao.updateUser(from); userDao.updateUser(to); } } ``` 在上面的示例中,@Transactional 注解用于 UserServiceImpl 类上,表示该类中的所有方法都将使用声明式事务管理。在 transferMoney() 方法中,当更新两个用户的余额时,如果发生异常,Spring 会自动回滚事务,确保转账操作在原子性和一致性方面的正确性。 注意,为了使声明式事务管理正常工作,需要在 Spring 配置文件中配置事务管理器和事务通知等相关组件。例如: ```xml <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="transferMoney" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="userServicePointcut" expression="execution(* com.example.UserService.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="userServicePointcut"/> </aop:config> ``` 在上面的示例中,配置了一个 DataSourceTransactionManager 作为事务管理器,并使用 txAdvice 定义了一个事务通知。通过 aop:config 和 aop:advisor 将该事务通知织入到 UserService 中,以进行声明式事务管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值