2019独角兽企业重金招聘Python工程师标准>>>

Spring声明式事务配置,实现模拟转账过程 (AspectJ)

编程式事务要修改service层的代码,很少用,相比之下,AspectJ增强事务管理器,在xml中配置切面切点(AOP),而service代码不用做修改。

1.新建数据表

 DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`money` double unsigned zerofill DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `account` VALUES ('1', 'aa', '1000');
INSERT INTO `account` VALUES ('2', 'bb', '1000');
INSERT INTO `account` VALUES ('3', 'cc', '1000');

2.新建项目,引入jar包

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>4.2.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.2.1.RELEASE</version></dependency><!-- spring end --><!-- c3p0 --><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency>

3.log4.properties

#console log
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n
#all log
log4j.appender.DAILY_ALL=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DAILY_ALL.layout=org.apache.log4j.PatternLayout
log4j.appender.DAILY_ALL.layout.ConversionPattern="%p %d{yyyy-MM-dd HH:mm:ss} %-50.50c(%L) - %m%n
log4j.appender.DAILY_ALL.File=d:/myjaval.log
log4j.appender.DAILY_ALL.DatePattern='.'yyyy-MM-dd
#logger
#log4j.logger.org.springframework=INFO,CONSOLE
#log4j.logger.org.hibernate=INFO,CONSOLE
#log4j.logger.org.apache=INFO,CONSOLE
log4j.rootLogger=INFO,CONSOLE,DAILY_ALL

4.jdbc.properties

jdbc_driverClassName=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
jdbc_username=root
jdbc_password=root

5.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:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 声明式事务管理 --><!-- 引入外部属性文件 --><!-- <context:property-placeholder location="classpath:jdbc.properties"/> --><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:jdbc.properties</value></list></property></bean><!-- c3p0连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc_driverClassName}" /><property name="jdbcUrl" value="${jdbc_url}" /><property name="user" value="${jdbc_username}" /><property name="password" value="${jdbc_password}" /></bean><!-- 配置业务层 --><!-- 开启annotation --><context:annotation-config/><context:component-scan base-package="cn.dx.spring.transaction2.service" /><context:component-scan base-package="cn.dx.spring.transaction2.dao" /><!-- JDBC模板 -->
<bean id="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource" />
</bean><!-- 配置事务管理器: -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean><!-- 开启AOP监听 只对当前配置文件有效 -->
<aop:aspectj-autoproxy expose-proxy="true"/><!-- 开启注解事务 只对当前配置文件有效 -->
<tx:annotation-driven transaction-manager="txManager"/><!-- 配置事务的通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- transfre方法 ( *代表所有 )--><tx:method name="transfer" propagation="REQUIRED" /></tx:attributes>
</tx:advice><!-- 配置事务的切点,并把事务切点和事务属性不关联起来 -->
<aop:config expose-proxy="true"><!-- 切点   只对业务逻辑层实施事务 --><aop:pointcut id="txPointcut" expression="execution(* cn.dx.spring..service..*.*(..))" /><!-- 切面 --><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/></aop:config>
</beans>

6.DAO以及实现

package cn.dx.spring.transaction2.dao;public interface AccountDao {/*** @param out 转出账户* @param money 转出金额*/void outMoney(String out,Double money);/*** @param in  :传入账号* @param money :转入金额*/void inMoney(String in,Double money);
}
package cn.dx.spring.transaction2.dao.impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;import cn.dx.spring.transaction2.dao.AccountDao;@Component("AccountDao")
public class AccountDaoImpl implements AccountDao {@Autowiredprivate JdbcTemplate jdbcTemplate; @Overridepublic void outMoney(String out, Double money) {String sql = "update account set money = money - ? where name = ?";this.jdbcTemplate.update(sql,money,out);}@Overridepublic void inMoney(String in, Double money) {String sql = "update account set money = money + ? where name = ?";this.jdbcTemplate.update(sql,money,in);}}

7.service以及实现

package cn.dx.spring.transaction2.service;/*** 转账Service* @author 大雄**/
public interface AccountService {/*** * @param out:转出账户* @param in:转入账户* @param money:转账金额*/void transfer(String out,String in,Double money);}
package cn.dx.spring.transaction2.service.impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;import cn.dx.spring.transaction2.dao.AccountDao;
import cn.dx.spring.transaction2.service.AccountService;@Service("AccountService")
public class AccountServiceImpl implements AccountService {@Autowired@Qualifier("AccountDao")private AccountDao accountDao;@Overridepublic void transfer(final String out,final String in,final Double money) {accountDao.outMoney(out, money);int i = 1/0;accountDao.inMoney(in, money);}}

8.测试

package cn.dx.myjava.spring.transaction;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import cn.dx.spring.transaction.service.AccountService;/*** 编程式事务管理* 转账测试* @author 大雄**/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Transtraction {//测试业务层的类@Autowired@Qualifier("AccountService")private AccountService accountService;@Testpublic void  transaction(){this.accountService.transfer("aa", "bb", 200d);}}

转载于:https://my.oschina.net/daxiong0615/blog/502476

AspectJ声明式事务配置相关推荐

  1. 总结xml配置spring-aop声明式事务配置与hibernate报错:** isno active spring和hibernate整合,原因会话工厂去路(到spring不仅仅是bean)错误

    spring事务管理太厉害了!!可以不再自管事务开发了! spring aop声明式事务配置 问题: 困扰我近十多天的的spring事务管理终于解决了, 再也不用自己管理事务了 嗯,可以删该死的hib ...

  2. Spring声明式事务配置详解

    事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性.本文主要讲解事务涉及到一些概念以及spring中事务的使用.如有理解偏颇之处,恳请各位大神指正,小编不胜感激! 1.何为事务?   ...

  3. 【Spring】——声明式事务配置详解

    事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性.本文主要讲解事务涉及到一些概念以及spring中事务的使用.如有理解偏颇之处,恳请各位大神指正,小编不胜感激! 1.何为事务? 事 ...

  4. Spring Hibernate使用TransactionInterceptor声明式事务配置

    <!-- 事务管理器 -->  <bean id="transactionManager" class="org.springframework.orm ...

  5. spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)

    1. 声明式事务管理分类 声明式事务管理也有两种常用的方式, 一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解. 显然基于注解的方式更简单易用,更清爽. ...

  6. Spring声明式事务管理的配置详解

    环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...

  7. 编程式事务与声明式事务

    编程式事务 1.加入jar包 com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar co ...

  8. Java程序员从笨鸟到菜鸟之(八十)细谈Spring(九)spring+hibernate声明式事务管理详解

    声明式事务管理是spring对事务管理的最常用的方式,因为这种方式对代码的影响最小,因此也符合非侵入性的轻量级容器的概念.Spring的事务管理是通过AOP的方式来实现的,因为事务方面的代码与spri ...

  9. spring控制事务:声明式事务(注解)

    声明式事务(注解) spring声明事务的方式,使用注解的方式 @Transactional ⚫ 名称:@Transactional ⚫ 类型:方法注解,类注解,接口注解 ⚫ 位置:方法定义上方,类定 ...

最新文章

  1. RHEL7.0系列 修改字符终端分辨率
  2. 想知道聊天室系统是怎么做的吗?
  3. UA MATH571A 回归分析 概念与R code总结
  4. 在Repeater控件,Repeater1控件中都有FooterTemplate模板.但你在后台中如何去找FooterTemplate中的控件呢?...
  5. 如何用JavaScript实现2+2=5?
  6. caffe matio问题
  7. nx set 怎么实现的原子性_正确地使用Redis的SETNX实现锁机制
  8. SilverLight之我见
  9. 使用 C# 编写简易 ASP.NET Web 服务器 ---- 模拟IIS的处理过程
  10. 配置的代理服务器未响应 电脑连不上网_手机、电脑为什么连不上网(断网)?...
  11. 江苏计算机类事业编总分多少,必看!江苏事业单位统考三类岗位分值分布
  12. 2021年初行政区划数据
  13. 快速理解和掌握MIB
  14. 通过网页直接打开微信关注页面方法
  15. 桥接模式和装饰者模式的区别及理解
  16. ORA-00937:不是单组分组函数 ORA-22818:这里不允许出现子查询表达式
  17. vector访问失效的问题
  18. Linux常用命令——grep用法
  19. 文章分类标签数据库设计
  20. 隐写术浅谈(二):LSB隐写与IDAT隐写

热门文章

  1. array_shift -- 将数组开头的单元移出数组
  2. 线程池中线程抛了异常如何处理?
  3. JVM优化系列-对象内存分配和回收的细节
  4. Dubbo学习笔记(二)
  5. java类型转换_Java类型转换
  6. Rust性能分析-迭代器的enumerate方法是否会影响程序性能
  7. kafka 常见问题( 持续更新... ... )
  8. 使用jstack查看某个Java进程内的线程堆栈信息
  9. SpringCloud 使用Zuul构建微服务网关
  10. redis经典三节点高可用哨兵模式集群搭建