spring事务管理-摘抄
原著网址 http://gcq04552015.iteye.com/blog/1666570
Spring是以代理的方式实现对事务的管理。我们在Action中所使用的Service对象,其实是代理对象的实例,并不是我们所写的Service 对象实例。既然是两个不同的对象,那为什么我们在Action中可以象使用Service对象一样的使用代理对象呢?为了说明问题,假设有个 Service类叫AService,它的Spring事务代理类为AProxyService,AService实现了一个接口 IAService (这里多了一个接口IAService,是为了说明接口代理的方式)。
Spring事务代理方式有两种,一种是类代理方式,一种是接口代理方式。在Spring的配置文件中可以指定代理方式,目前我们使用的都是类代理方式。 //以下配置指定为类代理方式
<property name="proxyTargetClass"><value>true</value></property>
1、类代理方式
类代理方式的实现方式是通过继承的方式来实现,下面用伪代码来说明。
interface IAService{
public void save(ValueObject object);
}
class AService implements IAService{
public void save(ValueObject object){ ... }
}
// Spring自动生成的代理类.
class AProxyService extends AService{
public void save(ValueObject object){
try{
启动事务的代码;
super.save(object);
提交事务的代码;
}catch(Exception e){
回滚事务的代码;
}
}
}
在Action的调用代码:
AService a = (AService)getBean("aProxyServiceBeanName");
这里 getBean("aProxyServiceBeanName") 得到的是 AProxyService
类的实例,因为AProxyService是AService的一个子类,所以这里可以强制转型为AService。我们后面调用
a.save(object)的时候,调用的是AProxyService.save()方法,而这个方法是有事务处理的。Spring就是这样实现了事
务管理。 // 下面的这行代码也是同样的效果。
IAService a = (IAService)getBean("aProxyServiceBeanName");
Spring通过CGLib来实现了类代理方式。
2、接口代理方式
接口代理方式是通过实现接口,引用类实例来实现的,所以这里一定要有一个接口IAService,而类代理方式是不需要这个接口的。
// Spring自动生成的代理类.
class AProxyService implements IAService{
private AService aService;
public void setAService(AService aService){
this.aService = aService;
}
public void save(ValueObject object){
try{
启动事务的代码;
aService.save(object); // 注意这行代码与上面的不同。
提交事务的代码;
}catch(Exception e){
回滚事务的代码;
}
}
}
在Action的调用代码:
AService a = (AService)getBean("aProxyServiceBeanName");
上面这行代码会报ClassCastException错误,因为 getBean("aProxyServiceBeanName")
得到的是 AProxyService
类的实例,而AProxyService实例并不能转型为AService类型,虽然两者都实现了同一个接口,但他们之间并没有继承关系。就象
ArrayList 和 LinkedList,他们可以转换成List,但他们之间并不能互相转换。所以这里必须这样使用:
IAService a = (IAService)getBean("aProxyServiceBeanName"); // 要转换成接口类型。
调用a.save() 方法其实就是调用 AProxyService.save() 方法。
Spring通过Java动态代理来实现接口代理
注明:本帖子全文摘抄,仅供参考!
spring事务管理-摘抄的更多相关文章
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- spring事务管理器设计思想(二)
上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...
- spring事务管理器设计思想(一)
在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...
- 事务管理(下) 配置spring事务管理的几种方式(声明式事务)
配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...
- Spring事务管理器的应对
Spring抽象的DAO体系兼容多种数据访问技术,它们各有特色,各有千秋.像Hibernate是非常优秀的ORM实现方案,但对底层SQL的控制不太方便:而iBatis则通过模板化技术让你方便地控制SQ ...
- Spring事务管理(转)
1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...
- [Spring框架]Spring 事务管理基础入门总结.
前言:在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一 ...
- Spring 事务管理 01 ——
目录: 参考: 1.Spring 事务管理高级应用难点剖析: 第 1 部分
- Spring 事务管理原理探究
此处先粘贴出Spring事务需要的配置内容: 1.Spring事务管理器的配置文件: 2.一个普通的JPA框架(此处是mybatis)的配置文件: <bean id="sqlSessi ...
随机推荐
- Oracle游标整理二
1.概念 游标是指向SQL处理的内存区的句柄或指针.当使用一个PL/SQL块来执行DML语句或只返回一行结果的SELECT语句时,系统将自动创建一个隐式游标.如果SQL语句返回多个结果,就必须 ...
- 夺命雷公狗ThinkPHP项目之----企业网站13之文章列表页的实现(主要是分页的实现)
列表页这个其实是比较简单的一个,直接遍历除数据即可: public function lists(){ //$mod = M("Article")->select(); // ...
- 由ccf第一题引出的问题
当时的情况是这样的,代码中需要用到一个较大的二维数组,但只要定义这个大二维数组编译就出错,无奈后来用malloc自己实现了类似二维数组的操作. 其中的b数组设为全局的或者静态的也都可以解决overfl ...
- access调用联系
using System; using System.Configuration; using System.Data; using System.Linq; using System.Web; us ...
- NOIP200505谁拿了最多的奖学金
NOIP200505谁拿了最多的奖学金 Description 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期 ...
- Ceph的客户端丢失文件夹的解决办法
原来的解决办法 更新linux内核,使用linux内核级的mount方式,一段时间后将会在客户端看不到部分长期不使用的文件夹 更正后的解决办法 参考Ceph的客户端安装设置ceph-fuse方式挂载c ...
- 验证(Javascript和正则表达式)
昨天写了验证(C#和正则表达式),今天又写了个js版的验证.现在贴出来,为了方便自己查阅,同时也希望能给需要的人帮助和一些启发.由于今天才开始接触js,所以可能会有一些错漏,希望大家能批评指正. va ...
- 利用Qt Assistant 定制帮助文档
为了将Qt Assistant定制为自己应用程序的帮助文档浏览器.需要完成以下几步: 一.导入HTML格式的帮助文档 (1)首先,针对自己的应用程序创建HTML格式的帮助文档,请参见<Doxyg ...
- 【python cookbook】【数据结构与算法】17.从字典中提取子集
问题:想创建一个字典,其本身是另一个字典的子集 解决方案:利用字典推导式(dictionary comprehension)可轻松解决 # example of extracting a subset ...
- oracle 数据泵 每天自动备份
@echo off echo 删除10天前的备分文件和日志 forfiles /p "e:\app\back" /m *.dmp /d -5 /c "cmd /c del ...