zoukankan      html  css  js  c++  java
  • Spring声明式事务管理(基于XML方式实现)

    --------------------siwuxie095

       

       

       

       

       

       

       

    Spring 声明式事务管理(基于 XML 方式实现)

       

       

    以转账为例

       

       

    1、基于 XML 配置文件的方式实现声明式事务管理,其思想就是 AOP 思想

       

       

       

       

    2、导入相关 jar 包(共 13 个包)

       

    1)导入核心 jar 包和日志相关的 jar 包

       

       

       

       

    2)导入 JdbcTemplate 的 jar 包

       

       

       

       

    3)导入 MySQL 的 JDBC 驱动包

       

       

       

    mysql-connector-java 下载链接:

       

    https://dev.mysql.com/downloads/connector/j/

       

       

       

    4)导入 AOP 和 AspectJ 的 jar 包

       

       

       

    其中:

       

    aopalliance 下载链接:

       

    http://mvnrepository.com/artifact/aopalliance/aopalliance

       

       

    aspectjweaver 下载链接:

       

    http://mvnrepository.com/artifact/org.aspectj/aspectjweaver

       

       

       

       

    3、在 MySQL 中手动创建数据库和表

       

    数据库名:tx_db,表名:account,字段:id、name、money

       

       

       

    手动添加数据,用作测试

       

       

       

       

       

    4、具体步骤

       

    1)配置事务管理器

       

    <!-- 配置事务管理器 -->

    <bean id="transactionManager"

    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <!--

    DataSourceTransactionManager 源代码中有

    属性 dataSource 和其 set 方法,所以可以注入

    -->

    <property name="dataSource" ref="dataSource"/>

    </bean>

       

       

       

    2)配置事务的通知增强

       

    <!-- 配置事务的通知(增强) -->

    <tx:advice id="txAdvice" transaction-manager="transactionManager">

    <tx:attributes>

    <!--

    isolation="DEFAULT" 隔离级别

    propagation="REQUIRED" 传播行为

    read-only="false" 只读

    timeout="-1" 过期时间

    rollback-for="" -Exception

    no-rollback-for="" +Exception

    -->

    <!--

    对进行事务操作的方法(一般是业务层方法)设置匹配规则,

    如:transfer* 所有以 transfer 开头的方法

    -->

    <tx:method name="transfer" propagation="REQUIRED"/>

    </tx:attributes>

    </tx:advice>

       

       

       

    3)配置 AOP

       

    <!-- 配置 AOP -->

    <aop:config>

    <!-- 配置切入点 -->

    <aop:pointcut expression="execution(* com.siwuxie095.service.AccountService.transfer(..))" id="pt"/>

    <!-- 配置切面(增强 + 切入点) -->

    <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>

    </aop:config>

       

       

       

       

    5、具体实现

       

    1)编写一个 Dao 类

       

    AccountDao.java:

       

    package com.siwuxie095.dao;

       

    import org.springframework.jdbc.core.JdbcTemplate;

       

    public class AccountDao {

       

    private JdbcTemplate jdbcTemplate;

     

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

    this.jdbcTemplate = jdbcTemplate;

    }

     

     

    /**

    * 转出

    */

    public void lessMoney(String from, int money) {

    String sql="update account set money=money-? where name=?";

    jdbcTemplate.update(sql, money, from);

    }

     

     

    /**

    * 转入

    */

    public void moreMoney(String to, int money) {

    String sql="update account set money=money+? where name=?";

    jdbcTemplate.update(sql, money, to);

    }

     

    }

       

       

       

    2)编写一个 Service 类

       

    AccountService.java:

       

    package com.siwuxie095.service;

       

    import com.siwuxie095.dao.AccountDao;

       

    public class AccountService {

       

    private AccountDao accountDao;

     

    public void setAccountDao(AccountDao accountDao) {

    this.accountDao = accountDao;

    }

     

     

    /**

    * 转账

    */

    public void transfer(String from,String to,int money) {

     

    accountDao.lessMoney(from, money);

     

    // 即便中间出现了什么异常,也会进行回滚

    // 如:int num=10/0;

     

    accountDao.moreMoney(to, money);

     

    }

     

    }

       

       

       

    3)在配置文件中进行配置

       

    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: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/aop

    http://www.springframework.org/schema/aop/spring-aop.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">

     

     

    <!-- 配置内置连接池 -->

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

    <!--

    jdbc:mysql:///tx_db jdbc:mysql://localhost:3306/tx_db 的简写

    -->

    <property name="url" value="jdbc:mysql:///tx_db"/>

    <property name="username" value="root"/>

    <property name="password" value="8888"/>

    </bean>

     

     

     

    <!-- 配置事务管理器 -->

    <bean id="transactionManager"

    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <!--

    DataSourceTransactionManager 源代码中有

    属性 dataSource 和其 set 方法,所以可以注入

    -->

    <property name="dataSource" ref="dataSource"/>

    </bean>

     

     

    <!-- 配置事务的通知(增强) -->

    <tx:advice id="txAdvice" transaction-manager="transactionManager">

    <tx:attributes>

    <!--

    isolation="DEFAULT" 隔离级别

    propagation="REQUIRED" 传播行为

    read-only="false" 只读

    timeout="-1" 过期时间

    rollback-for="" -Exception

    no-rollback-for="" +Exception

    -->

    <!--

    对进行事务操作的方法(一般是业务层方法)设置匹配规则,

    如:transfer* 所有以 transfer 开头的方法

    -->

    <tx:method name="transfer" propagation="REQUIRED"/>

    </tx:attributes>

    </tx:advice>

     

     

    <!-- 配置 AOP -->

    <aop:config>

    <!-- 配置切入点 -->

    <aop:pointcut expression="execution(* com.siwuxie095.service.AccountService.transfer(..))" id="pt"/>

    <!-- 配置切面(增强 + 切入点) -->

    <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>

    </aop:config>

     

     

     

    <!-- 配置对象并注入属性 -->

    <bean id="accountService" class="com.siwuxie095.service.AccountService">

    <property name="accountDao" ref="accountDao"></property>

    </bean>

     

    <bean id="accountDao" class="com.siwuxie095.dao.AccountDao">

    <property name="jdbcTemplate" ref="jdbcTemplate"></property>

    </bean>

     

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

    <!--

    JdbcTemplate 源代码中有属性 dataSource

    和其 set 方法,所以可以注入

    -->

    <property name="dataSource" ref="dataSource"></property>

    </bean>

       

       

    </beans>

       

       

       

    4)编写一个测试类

       

    TestDemo.java:

       

    package com.siwuxie095.test;

       

    import org.junit.Test;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

       

    import com.siwuxie095.service.AccountService;

       

    public class TestDmo {

       

    /**

    * 手动加上 @Test 以进行单元测试(将自动导入 JUnit 4 jar 包)

    *

    * 选中方法名,右键->Run As->JUint Test

    */

    @Test

    public void testService() {

     

    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

     

    AccountService accountService=(AccountService) context.getBean("accountService");

     

    accountService.transfer("小白", "小黑", 1000);

    }

     

    }

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    asp.net中的控件类型
    string、Empty和null三者的区别
    readonly和const的区别
    接口和抽象类的区别
    asp.net身份认证方式
    什么是继承
    dbca静默管理数据库&数据泵导出导入 大风起
    应用偶发性连接不上Oracle数据库的排查案例 大风起
    开源控件SourceGrid学习(附源代码)
    强类型与弱类型Dataset 与DataTable间的艰难选择
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/7420079.html
Copyright © 2011-2022 走看看