学习Spring事务管理时的源码
- 所有的demo都是以“转账(transfer)”为示例的
- dao层中有2个方法:inMoney和outMoney,分别对应“入账”和“出账”
- service层有1个方法:transfer,对应“转账”
转账分为两步:
- A账户扣钱
- B账户加钱
既然是 事务管理 ,那么测试的方法就是在第1步(outMoney(A, 100))之后发生异常。 如果A账户的钱减少了,就说明事务管理没有生效(因为没有回滚(rollback)),反之则有效。
- Demo1为测试示例
- 使用编程式事务管理
- DAO层通过JdbcTemplate来操作数据库,简化代码
- 使用org.springframework.transaction.support.TransactionTemplate管理事务 并向TransactionTemplate中注入事务管理器
- 在Service层中直接调用TransactionTemplate的execute方法来执行业务
- Demo2为测试示例
- 使用声明式事务管理
- 采用AOP的方式,通过配置org.springframework.transaction.interceptor.TransactionProxyFactoryBean来管理事务和生成代理 注入需要代理的业务、事务管理器、事务的属性
- 使用生成的代理来执行业务
- Demo3为测试示例
- 使用AspectJ,基于XML的方式配置
- 配置dataSource、Dao、Service
- 配置事务管理器
- 既然是使用AspectJ,那么就要配置通知(Advice)
- 在aop:config中定义切点(Pointcut),并和Advice整合
- Demo4为测试用例
- 使用AspectJ,基于注解的方式配置
- 配置基本同demo3
- 不需要配置aop:config,转为使用tx:annotation-driven,并在其中配置transactionManager
- 在需要进行事务管理的class上写上注解@Transaction,spring就会使用transactionManager来进行事务管理了
- Demo5为测试用例
- 将大部分配置转为注解配置
- 配置transactionManager、transactionAdvice(txAdvice),最后在aop:config中配置使用transactionManager的Pointcut
- 增加了查询的方法
- 所有的jar包都在lib文件夹下
- 所有文件编码格式统一为UTF-8
- 视频地址:http://www.imooc.com/learn/478