============
TransactionProxyFactoryBean方式
package cn.muke.spring.demo2; /** * 转账案例的DAO层的接口 */ public interface AccountDao { /** * @param out:转出账号 * @param money:转账金额 */ public void outMoney(String out, Double money); /** * @param in:转入账号 * @param money:转入金额 */ public void inMoney(String in, Double money); }
package cn.muke.spring.demo2; import org.springframework.jdbc.core.support.JdbcDaoSupport; /** * 转账案例的DAO层的实例类 */ public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { public void outMoney(String out, Double money) { String sql="update account set money=money-? where name=?"; this.getJdbcTemplate().update(sql,money,out); } public void inMoney(String in, Double money) { String sql="update account set money=money+? where name=?"; this.getJdbcTemplate().update(sql,money,in); } }
package cn.muke.spring.demo2; /** * 转账案例的业务层接口. */ public interface AccountService { /** * @param out :转出账号 * @param in :转入账号 * @param money:转出金额 */ public void transfer(String out, String in, Double money); }
package cn.muke.spring.demo2; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionTemplate; /** * 转账案例的业务层接口实现类 */ public class AccountServiceImpl implements AccountService { //注入转账的DAO的类 private AccountDao accountDao; public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } //注入事务管理的模板; private TransactionTemplate transactionTemplate; public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } /** * @param out :转出账号 * @param in :转入账号 * @param money:转出金额 */ public void transfer(String out,String in, Double money) { accountDao.outMoney(out,money); int i=1/0; accountDao.inMoney(in,money); } }
package cn.muke.spring.demo2; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; /** * Spring的声明式事务管理的方式一的测试类 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext2.xml") public class SpringDemo2 { /** * 注入代理类:因为代理类进行了增强操作 */ @Resource(name="accountServiceProxy") private AccountService accountService; @Test /** * 转账案例; */ public void demo1(){ accountService.transfer("aaa","bbb",200d); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/aop/spring-tx.xsd"> <!--引入外部的属性文件--> <context:property-placeholder location="classpath:jdbc.properties" /> <!--配置C3P0的连接池--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--配置业务层--> <bean id="accountService" class="cn.muke.spring.demo2.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> </bean> <!--配置DAO的类--> <bean id="accountDao" class="cn.muke.spring.demo2.AccountDaoImpl"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置业务层的代理--> <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!--配置目标对象--> <property name="target" ref="accountService"/> <!--注入事务管理器--> <property name="transactionManager" ref="transactionManager"/> <!--注入事务的属性--> <property name="transactionAttributes"> <props> <!--prop的格式:\ * PROPAGATION:事务的传播行为 * ISOLATION:事务的隔离级别 * readOnly:只读 * -Exception:发生哪些异常回滚事务 * +Exception:发生哪些异常不回滚(比如:+java.lang.ArithmeticException)--> <prop key="transfer">PROPAGATION_REQUIRED</prop> </props> </property> </bean> </beans>
=================AspectJ XML方式=====================
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--引入外部的属性文件--> <context:property-placeholder location="classpath:jdbc.properties" /> <!--配置C3P0的连接池--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--配置业务层--> <bean id="accountService" class="cn.muke.spring.demo3.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> </bean> <!--配置DAO的类--> <bean id="accountDao" class="cn.muke.spring.demo3.AccountDaoImpl"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置事务管理器--> <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="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/> </tx:attributes> </tx:advice> <!--配置切面--> <aop:config> <!--配置切入点--> <aop:pointcut id="pointcut1" expression="execution(* cn.muke.spring.demo3.AccountService+.*(..) )"/> <!-- 配置切面--> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config> </beans>
/** * 生命式事务管理的方式二:基于AspectJ的XML方式的配置 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext3.xml") public class SpringDemo3 { @Resource(name="accountService") private AccountService accountService; @Test public void demo1(){ accountService.transfer("aaa","bbb",200d); } }
==================使用注解方式=================
package cn.muke.spring.demo4; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; /** * 转账案例的业务层接口实现类 * @Transactional 注解中的属性 * propagation:事务的传播行为 * isolation:事务的隔离级别 * readOnly:只读 * rollbackFor:发生哪些异常回滚 * noRollbackFor:发生哪些异常不回滚 */ @Transactional(propagation = Propagation.REQUIRED) public class AccountServiceImpl implements AccountService { //注入转账的DAO的类 private AccountDao accountDao; public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } //注入事务管理的模板; private TransactionTemplate transactionTemplate; public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } /** * @param out :转出账号 * @param in :转入账号 * @param money:转出金额 */ public void transfer(String out,String in, Double money) { accountDao.outMoney(out,money); int i=1/0; accountDao.inMoney(in,money); } }
package cn.muke.spring.demo4; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; /** * Spring的声明式事务管理的方式三:基于注解的事务管理的方式 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext4.xml") public class SpringDemo4 { @Resource(name="accountService") private AccountService accountService; /** * 转账案例 */ @Test public void demo1(){ accountService.transfer("aaa","bbb",200d); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--引入外部的属性文件--> <context:property-placeholder location="classpath:jdbc.properties" /> <!--配置C3P0的连接池--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--配置业务层--> <bean id="accountService" class="cn.muke.spring.demo4.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> </bean> <!--配置DAO的类--> <bean id="accountDao" class="cn.muke.spring.demo4.AccountDaoImpl"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--开启注解事务--> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>