• Spring事务管理3----声明式事务管理(1)


     声明式事务管理(1)基于    基于 tx/aop 

      这种事务管理相比编程式事务管理来说对业务层基本没有改动,通过  TransactionProxyFactoryBean 创建业务层的代理,通过AOP技术给业务层的代理增强,增加事务管理

    但是这种方式的事务管理方式组要对每一个业务层的类都创建一个代理,增加了XML的复杂程度。

    dao层

    /**
     * @author AT
     * 转账dao层
     */
    public interface AccountDao {
        /**
         * 转出钱
         * @param outer
         * @param money
         */
        public void remove(String outer,Double money);
        /**
         * 转入钱
         * @param input
         * @param money
         */
        public void add(String input,Double money);
    }

    dao层实现类

    /**
     * 转账dao层实现
     */
    public class AccountDaoimpl extends JdbcDaoSupport implements AccountDao{
        /**
         * 转出钱
         * @param outer
         * @param money
         */
        @Override
        public void remove(String outer, Double money) {
            String sql = "update account set money = money - ? where name = ?";
            this.getJdbcTemplate().update(sql, money,outer);
        }
        /**
         * 转入钱
         * @param input
         * @param money
         */
        @Override
        public void add(String input, Double money) {
            String sql = "update account set money = money + ? where name = ?";
            this.getJdbcTemplate().update(sql, money,input);
        }
        
    }

    service业务层实现类

    /**
     * @author AT
     *  编程式事务管理
     */
    public class AccountServiceImpl implements AccountSevice {
        
        @Resource(name="accountDao")
        private AccountDao accountDao;
        @Override
        public void transfer(final String input, final String out,final  Double money) {
            accountDao.remove(out, money);
            int a = 1/0;
            accountDao.add(input, money);
        }
        
         public void setAccountDao(AccountDao accountDao) {
            this.accountDao = accountDao;
        }
    }

    service业务层

    /**
     * @author AT
     * 转账业务接口
     */
    public interface AccountSevice {
        public void transfer(String input,String out,Double money);//消费
    }

    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: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/tx 
            http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop.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>
        
        <!-- dao层和业务的类 -->
        <bean id="accountDao" class="com.sdf.spring01.AccountDaoimpl">
            <property name="dataSource" ref="datasource"></property>
        </bean>
        <bean id="accountService" class="com.sdf.spring01.AccountServiceImpl">
            <property name="accountDao" ref="accountDao"/>
        </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        :只读(不允许执行del  uodate  modify sql语句)
                        * -Exception    :发生该异常回滚
                        * +Exceeption    :发生该异常不回滚
                     -->
                    <prop key="transfer">PROPAGATION_REQUIRED</prop>
                </props>
            </property>
        </bean>
    </beans>

    测试类

    /**
     * @author AT
     * 测试转账信息     声明式事务管理  基于 tx/aop   
     * 创建业务层代理 给代理增强
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext01.xml")
    public class AccountTest {
    //    @Resource(name="accountService")
    //    private AccountSevice accountService;
        /**
         * 注入代理类
         */
        @Resource(name="accountServiceProxy")
        private AccountSevice accountService;
        @Test
        public void test01(){
            accountService.transfer("A", "B", 300d);
        }
        public void setAccountService(AccountSevice accountService) {
            this.accountService = accountService;
        }
    }
  • 相关阅读:
    C#泛型集合之——链表
    C#泛型集合之——列表
    C#泛型集合之——哈希集合
    gRPC asp.net core自定义策略认证
    asp.net core mvc中自定义ActionResult
    当职责链遇到DI
    开发一个带UI的库(asp.net core 3.0)
    两个集合对比
    对日编程的一些小知识点
    基于aws api gateway的asp.net core验证
  • 原文地址:https://www.cnblogs.com/kuoAT/p/7803504.html
Copyright © 2020-2023  润新知