Spring Mvc那点事---(34)Spring事务基于AspectJ实现
来源:互联网 发布:百度网盘显示网络异常 编辑:程序博客网 时间:2024/05/16 14:09
Spring事务也可以通过AspectJ切面来实现,通过配置切点和事务通知来实现控制事务。下面我们看看使用AspectJ来怎么控制事务。
CREATE TABLE `useraccount` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL, `money` double DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8引入JAR包
<dependencies> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --><dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.36</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.2.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api --><dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.2</version></dependency><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.5</version></dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
applicationContext.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:repo="http://www.springframework.org/schema/data/repository" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository-1.7.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd " default-lazy-init="true"> <description>Spring配置</description> <context:annotation-config /><!-- 引入数据源配置文件 --><context:property-placeholder location="classpath:jdbc.properties"/> <!-- 连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.url}"></property> <property name="user" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!-- 持久层 --> <bean id="userAccountDao" class="com.trans.trans03.UserAccountDao"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="userAccoutService" class="com.trans.trans03.UserAccoutService"> </bean> <!-- 配置事务管理其 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入数据连接池 --> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务通知 --> <tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <!-- 设置事务方法 --> <tx:method name="UserTransferMoney" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 配置切面 --> <aop:config> <aop:pointcut expression="execution(* com.trans.trans03.IUserAccoutService+.*(..) )" id="pointcut"/> <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> </aop:config> </beans>
持久层
package com.trans.trans03;public interface IUserAccountDao {//转出账户public void TransferOut(String user,double money);//转入账户public void TransferIn(String user,double money);}
package com.trans.trans03;import org.springframework.jdbc.core.support.JdbcDaoSupport;public class UserAccountDao extends JdbcDaoSupport implements IUserAccountDao {public void TransferOut(String user, double money) {// TODO Auto-generated method stubString sql="UPDATE `useraccount` SET money=money-? WHERE username=?";this.getJdbcTemplate().update(sql, money,user);}public void TransferIn(String user, double money) {// TODO Auto-generated method stubString sql="UPDATE `useraccount` SET money=money+? WHERE username=?";this.getJdbcTemplate().update(sql, money,user);}}业务层
package com.trans.trans03;public interface IUserAccoutService {//fromAccount来源账户 toAccount目标账户,money金额public void UserTransferMoney(String fromAccount,String toAccount,double money);}
package com.trans.trans03;import javax.annotation.Resource;import org.springframework.transaction.TransactionStatus;import org.springframework.transaction.support.TransactionCallback;import org.springframework.transaction.support.TransactionCallbackWithoutResult;import org.springframework.transaction.support.TransactionTemplate;public class UserAccoutService implements IUserAccoutService {@Resource(name="userAccountDao")private IUserAccountDao userAccountDao; public void UserTransferMoney(String fromAccount,String toAccount, double money) { // org.springframework.transaction.TransactionDefinition.ISOLATION_REPEATABLE_READuserAccountDao.TransferOut(fromAccount, money);//转出账户int m=5/0; //出现异常userAccountDao.TransferIn(toAccount, money);//转入账户}}
开始转账
package com.trans.trans03;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * Hello world! * */public class App { public static void main( String[] args ) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); //获取代理类 IUserAccoutService service=(IUserAccoutService)context.getBean("userAccoutService"); service.UserTransferMoney("001", "002", 100); }}
demo下载
http://download.csdn.net/detail/zx13525079024/9590753
0 0
- Spring Mvc那点事---(34)Spring事务基于AspectJ实现
- Spring Mvc那点事---(33)Spring事务基于AOP实现
- Spring Mvc那点事---(35)Spring事务基于注解实现
- Spring Mvc那点事---(26)Spring Mvc基于Schema的AOP实现
- Spring Mvc那点事---(27)Spring Mvc基于aspect的AOP实现
- Spring Mvc那点事---(32)Spring编程式事务的实现
- Spring Mvc那点事---(28)Spring Mvc基于ProxyFactoryBean的传统AOP
- Spring Mvc那点事---(29)Spring Mvc基于ProxyFactoryBean的传统AOP使用正则拦截
- Spring 事务失效那点事
- Spring Mvc那点事---(19)Spring Mvc过滤器Filter实现登陆验证
- Spring Mvc那点事---(30)Spring Mvc传统AOP自动代理实现
- Spring Mvc那点事---(3)Spring Mvc项目创建
- Spring Mvc那点事---(4)Spring Mvc控制器Controller
- Spring Mvc那点事---(7)Spring Mvc @Autowired注解
- Spring Mvc那点事---(8)Spring Mvc @Resource注解
- Spring Mvc那点事---(9)Spring Mvc @Component注解
- Spring Mvc那点事---(18)Spring Mvc过滤器Filter
- Spring Mvc那点事---(21)Spring Mvc拦截器
- ue4-日志使用
- Linux内核分析。4
- Android中Context的传递
- 认识CoreData-高级用法
- stack/queue
- Spring Mvc那点事---(34)Spring事务基于AspectJ实现
- 认识CoreData-多线程
- Xcode之断点调试详解
- 设计模式-抽象工厂
- 用两个栈实现对列 用两个队列实现栈
- Linux内核分析。5
- GNU make
- C# 16进制与字符串、字节数组之间的转换
- Web前端和后端之区分