Spring学习-32:Spring中的事务管理之声明式事务(原始方式,基于TransactionProxyBean)
来源:互联网 发布:马锐拉的池塘 知乎 编辑:程序博客网 时间:2024/06/01 08:19
手动编码的方式实现事务的管理代码量大,代码有侵入性。
怎么解决这些问题呢?其实,我们可以考虑一个问题:事务管理其实就是在操作之前把connection打开,操作完毕之后关闭connection,并确保操作的事务性。是不是类似于增强了原来的数据库操作呢?
所以,声明式事务就是基于功能的增强。原始方式的声明式事务管理,是基于一个类:TransactionProxyFactoryBean(它可以生成一个基于事务的对象代理)
预备工作:新建一个项目,详见Spring学习-30项目环境搭建,另外,还需要引入aop包和aop联盟的包
接下来,我们就来介绍一下声明式事务管理(原始方式)的具体步骤:
1、配置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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置属性文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 配置C3P0连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"></property><property name="jdbcUrl" value="${jdbc.url}"></property><property name="user" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property></bean><!-- 定义JDBC的模板类 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 业务层类 --><bean id="accountService" class="com.js.demo2.AccountServiceImpl"><!-- 在业务层注入Dao --><property name="accountDao" ref="accountDao"></property></bean><!-- 持久层类 --><bean id="accountDao" class="com.js.demo2.AccountDaoImpl"><!-- 注入连接池对象,通过连接池对象去创建JDBC模板 --><property name="dataSource" ref="dataSource"></property></bean><!--事务管理器--><bean id="transactionManager" 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><!-- 注入事务管理器 --><property name="transactionManager" ref="transactionManager"></property><!-- 设置事务的一些属性 --><property name="transactionAttributes"><props><prop key="transfer">PROPAGATION_REQUIRED</prop></props></property></bean></beans>
【补充】:prop参数配置的格式:PROPAGATION,ISOLATION,readOnly,-Exception,+Exception
-顺序:传播行为、隔离级别、事务是否只读、发生哪些异常可以回滚事务(所有的异常都回滚)、发生了哪些异常不回滚
2、编写测试类
【注 】注入的时候,不能注入原来的service对象,而要注入代理对象!
package com.js.demo2;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext2.xml")public class Test1 {@Autowired@Qualifier("accountServiceProxy")private AccountService accountService;@Testpublic void demo(){//完成转账accountService.transfer("aaa", "bbb", 100d);}}3、运行测试,转账成功。
关于发生异常时,事务回滚的测试此处不再赘述,跟上一讲同样(加个除零异常)测试即可。
缺点:就是需要为每一个管理事务的类生成代理,需要为每个类都进行配置。
0 0
- Spring学习-32:Spring中的事务管理之声明式事务(原始方式,基于TransactionProxyBean)
- Spring学习-33:Spring中的事务管理之声明式事务(基于切面自动代理)
- Spring学习-34:Spring中的事务管理之声明式事务(基于注解)
- 【spring】事务管理之声明式事务
- Spring 声明式事务管理----基于注解方式
- spring事务管理-声明式事务
- Spring事务管理实现方式之编程式事务与声明式事务详解
- Spring事务管理实现方式之编程式事务与声明式事务详解
- Spring框架事务管理之三:Spring声明式事务
- Spring 基于注解方式声明式事务
- Spring学习之声明式事务管理
- Spring中的事务属性介绍以及声明式事务管理
- Spring中的事务属性介绍以及声明式事务管理
- Spring学习-28:Spring中的事务管理之事务的回顾
- Spring声明式事务管理(基于xml的方式)
- Spring声明式事务管理(基于注解的方式)
- 基于@Transactional注解方式的spring声明式事务管理
- spring声明式事务管理(基于TransactionProxyFactoryBean的方式)
- ORACLE 解锁
- 移动开发知识技能
- 面试题:有1、2、3、4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数,并把它们都输出。
- 如何还原系统?系统还原教程
- 5分钟了解MySQL5.7union all用法的黑科技
- Spring学习-32:Spring中的事务管理之声明式事务(原始方式,基于TransactionProxyBean)
- eclipse里tomcat部署文件夹位置的问题(wtpwebapps)
- 在url中通过属性名获取属性值
- IOCP在WSARecv出现10054错误以后,ACCEPT假死的问题
- 调整Eclipse字体大小
- 关于php的foreach
- amazeUI的icon图标库
- 【个人笔记重点,不作为参考】主题:js数组
- 算法分析与设计2017-2-背包问题的贪心算法