spring声明式事务管理(基于TransactionProxyFactoryBean的方式)

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 05:18   798   0

以银行转账为例(本文只作为自己学习spring的备忘录,只对自己负责)

转账的dao层接口

  1. packagecom.slowly.springtrancation01;
  2. /**
  3. *转账的dao层接口
  4. *@authorhy
  5. *
  6. */
  7. publicinterfaceaccountDao{
  8. /**
  9. *
  10. *@paramout转出账户
  11. *@parammoney转出金额
  12. */
  13. publicvoidoutMoney(Stringout,Doublemoney);
  14. /**
  15. *
  16. *@paramin转入账户
  17. *@parammoney转入金额
  18. */
  19. publicvoidinMoney(Stringin,Doublemoney);
  20. }

转账dao层接口实现类

  1. packagecom.slowly.springtrancation01;
  2. importorg.springframework.jdbc.core.support.JdbcDaoSupport;
  3. publicclassaccountDaoImpextendsJdbcDaoSupportimplementsaccountDao{
  4. @Override
  5. publicvoidoutMoney(Stringout,Doublemoney){
  6. Stringsql="updateaccountsetbalance=balance-?whereaccount_name=?";
  7. this.getJdbcTemplate().update(sql,money,out);
  8. }
  9. @Override
  10. publicvoidinMoney(Stringin,Doublemoney){
  11. Stringsql="updateaccountsetbalance=balance+?whereaccount_name=?";
  12. this.getJdbcTemplate().update(sql,money,in);
  13. }
  14. }


转账的业务逻辑层接口

  1. packagecom.slowly.springtrancation01;
  2. /*
  3. *转账的业务层的接口
  4. */
  5. publicinterfaceaccountService{
  6. /**
  7. *
  8. *@paramout转出账户
  9. *@paramin转入账户
  10. *@parammoney转入的金额
  11. */
  12. publicvoidtransfer(Stringout,Stringin,Doublemoney);
  13. }

业务逻辑接口实现类

  1. packagecom.slowly.springtrancation01;
  2. importorg.springframework.transaction.TransactionStatus;
  3. importorg.springframework.transaction.support.TransactionCallbackWithoutResult;
  4. importorg.springframework.transaction.support.TransactionTemplate;
  5. publicclassaccountServiceImpimplementsaccountService{
  6. privateaccountDaoaccountDao;
  7. publicvoidsetAccountDao(accountDaoaccountDao){
  8. this.accountDao=accountDao;
  9. }

  10. @Override
  11. publicvoidtransfer(Stringout,Stringin,Doublemoney){
  12. accountDao.outMoney(out,money);
  13. //inti=1/0;
  14. accountDao.inMoney(in,money);
  15. }
  16. }


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/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.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="${driverClass}"></property>
         <property name="jdbcUrl" value="${jdbcUrl}"></property>
         <property name="user" value="${user}"></property>
         <property name="password" value="${password}"></property>
        </bean>
        <!-- 配置业务层 -->
        <bean id="accountService" class="com.slowly.springtrancation02.accountServiceImp">
         <property name="accountDao" ref="accountDao"></property>
        </bean>
        
        <!-- 配置dao层 -->
        <bean id="accountDao" class="com.slowly.springtrancation02.accountDaoImp">
         <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <!-- 事务管理配置 -->
        <bean id="tranctionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <!-- 配置业务层的代理 -->
        <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
         <!-- 配置目标对象 -->
         <property name="target" ref="accountService"/>
         <!-- 配置事务管理器 -->
         <property name="transactionManager" ref="tranctionManager"/>
         
    <!-- <property name="proxyTargetClass" value="true"></property> -->
         <!-- 注入事务属性 -->
         <property name="transactionAttributes">
          <props>
           <prop key="transfer">PROPAGATION_REQUIRED</prop>
          </props>
         </property>
         
        </bean>
       <!--   <bean id="myProxy" parent="accountServiceProxy">
      <property name="target" ref="accountService"/>
   </bean> -->


</beans>


测试

package com.slowly.springtrancation02;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

 public static void main(String[] args) {
  ApplicationContext apt = new ClassPathXmlApplicationContext("applicationContext2.xml");
  accountService accountService = (com.slowly.springtrancation02.accountService) apt.getBean("accountServiceProxy");
  accountService.transfer("乙", "甲", 600.00);

 }

}



测试用的和上文一样的数据库表

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP