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 ...
随机推荐
- clock
Prime Time中的clock分析包括: 1)Multiple clocks,clock from port/pin,virtual clock. 2)Clock network delay an ...
- yii Html中的a标签使用
1.use yii\helpers\Html; <?php echo Html::a('编辑',['edit','id'=>$info['goods_id']])?> 2.有确认框的 ...
- Java中main方面面试题
1.不用main方法如何定义一个类? 不行,没有main方法我们不能运行Java类. 在Java 7之前,你可以通过使用静态初始化运行Java类.但是,从Java 7开始就行不通了. 2.main() ...
- __ATTRIBUTE__ 你知多少?【转】
转自:http://www.cnblogs.com/astwish/p/3460618.html GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属 ...
- IntelliJ IDEA---java的编译工具【转】
转自:http://baike.baidu.com/link?url=sEpS0rItaB9BiO3i-qCdGSYiTIVPSJfBTjSXXngtN2hBhGl1j36CYQORKrbpqMHqj ...
- oracle 自定义 聚合函数
Oracle自定义聚合函数实现字符串连接的聚合 create or replace type string_sum_obj as object ( --聚合函数的实质就是一个对象 sum ...
- C# Community Projects
Community Supported C# Drivers See the officially supported MongoDB C# driver mongodb-csharp driver ...
- test if DEMO
可参考:http://blog.chinaunix.net/uid-20671208-id-3643362.html 1.test 举例: test -d ~/auto && echo ...
- paste DEMO合并文件
测试数据: [xiluhua@vm-xiluhua][~]$ cat msn.txt aaa bbb bbb ccc ccc ddd bbb eee aaa ccc bbb sss [xiluhua@ ...
- ECshop中TemplateBeginEditable 和后台编辑讲解
在ecshop的dwt文件里面经常发现有“<!-- TemplateBeginEditable name="doctitle" -->和<!-- #BeginLi ...