--------------------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】

Spring声明式事务管理(基于XML方式实现)的更多相关文章

  1. Spring声明式事务管理基于@Transactional注解

    概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解.         第一种方式我已在上文为大 ...

  2. Spring声明式事务管理基于tx/aop命名空间

    目的:通过Spring AOP 实现Spring声明式事务管理; Spring支持编程式事务管理和声明式事务管理两种方式. 而声明式事务管理也有两种常用的方式,一种是基于tx/aop命名空间的xml配 ...

  3. Spring声明式事务管理(基于注解方式实现)

    ----------------------siwuxie095                                 Spring 声明式事务管理(基于注解方式实现)         以转 ...

  4. XML方式实现Spring声明式事务管理

    1.首先编写一个实体类 public class Dept { private int deptId; private String deptName; public int getDeptId() ...

  5. Spring 声明式事务管理方式

    声明式事务管理,基于AOP对目标代理,添加环绕通知,比编码方案优势,不具有侵入式,不需要修改原来的代码. 1.基于XML配置的声明式事务管理方案(案例)      接口Service public i ...

  6. Spring声明式事务管理与配置介绍

    转至:http://java.9sssd.com/javafw/art/1215 [摘要]本文介绍Spring声明式事务管理与配置,包括Spring声明式事务配置的五种方式.事务的传播属性(Propa ...

  7. Spring声明式事务如何选择代理方式?

    Spring声明式事务如何选择代理方式   解决方法: 1.基于注解方法: <tx:annotation-driven transaction-manager="txManager&q ...

  8. spring 声明式事务管理

    简单理解事务: 比如你去ATM机取5000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉5000元钱:然后ATM出5000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了5000块但 ...

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

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

随机推荐

  1. js区分大小写

    JavaScript 区分大小写 区分大小写 JavaScript 语言是区分大小写的,不管是命名变量还是使用关键字的时候. 如前面 alert弹出提示框 的例子,如果将 alert 命令改为 ALE ...

  2. Linux 命令集合-错误

    错误1 说明:在linux下,./xxx.sh执行shell脚本时会提示No such file or directory.但shell明明存在,为什么就是会提示这个呢? 这种其实是因为编码方式不对, ...

  3. centos安装jdk1.7.80的rpm包

    1.jdk1.7.80的rpm的包的下载地址如下,请自己选择32位还是64位,下载完之后通过vmware的共享功能共享一个文件下,然后使用cp命令copy到linux系统中去. http://www. ...

  4. javascript节点操作移出节点removeChild()

    removeChild(a)是用来删除文档中的已有元素 参数a:要移出的节点 <div id="guoDiv"> <span>1</span> ...

  5. unity3d工程下的data file作用

    projectData文件夹中的data file: 1. Player settings – globalgamemanagers and globalgamemanagers.assets fil ...

  6. ganglia

    A.lamp界面快速搭建---------------------------------------------------------------------------------------- ...

  7. tp5 redis 单例模式 转载

    单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式有以下3个特点: 1 . 它必须有一个构造函数, ...

  8. 11.使用ForwardAction实现页面屏蔽。

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 我们在jsp页面之间写链接总会是.../xxx.jsp,而如果我们想屏蔽掉具 ...

  9. 1.HTML编码解码URL替换--代码整理

    public class HtmlCode { public static String encode(String str){ String s = ""; if (str.le ...

  10. Activity服务类-4 HistoryService服务类

    一共个方法15个方法 用于查询历史工作流信息1.创建查询(7个方法)//创建一个新的编程查询来搜索{@link HistoricProcessInstance}.HistoricProcessInst ...