spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象;声明式:主要使用TransactionProxyFactoryBean,围绕Poxy的动态代理,能够自动的提交和回滚事务。统观spring事务,围绕着两个核心PlatformTransactionManager和TransactionStatus,下面我们以声明式方式来讲解。

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事务详解(转载+高亮)的更多相关文章

  1. spring事务详解(五)总结提高

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.概念 ...

  2. spring事务详解(四)测试验证

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  3. spring事务详解(二)简单样例

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  4. spring事务详解(三)源码详解

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  5. spring事务详解(一)初探事务

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 引子 很多 ...

  6. Spring、Spring事务详解;使用XML配置事务

    @Transactional可以设置以下参数: @Transactional(readOnly=false) // 指定事务是否只读的 true/false @Transactional(rollba ...

  7. spring事务详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt122 Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式 ...

  8. JAVA框架之Spring【Spring事务详解】

    spring提供的事务管理可以分为两类:编程式的和声明式的.编程式的,比较灵活,但是代码量大,存在重复的代码比较多:声明式的比编程式的更灵活.编程式主要使用transactionTemplate.省略 ...

  9. spring事务详解(二)实例

    在Spring中,事务有两种实现方式: 编程式事务管理: 编程式事务管理使用底层源码可实现更细粒度的事务控制.spring推荐使用TransactionTemplate,典型的模板模式. 申明式事务管 ...

随机推荐

  1. centos7 docker redis

    docker run --name=redistmp -ti centos /bin/bash yum -y install gcc tcl make cd /home wget http://dow ...

  2. 欧拉回路(hdu3018)

    刚学图论不久,看着别人的博客慢慢学了一点基础的,感觉还是有点力不从心,感觉图论的题好多长得都很像,什么太监算法(Tarjan),Kosaraju,当然最基础的还是并查集...好了继续介绍这道题.... ...

  3. asp.net mvc bundle中数组超出索引

    在使用bundle 来加载css的时候报错了, @Styles.Render("~/bundles/appStyles") 第一反应 以为是的css 太多了,可是当我这个style ...

  4. Vue2随笔

    1. computed有缓存 methods没有缓存 慢慢更新中..... 2.Class与Style绑定 <div class="static" v-bind:class= ...

  5. jquery.trim() vs JS.trim()

    如果你在IE8浏览器下开发网站,其实这是个假命题,因为原生的javascript 并不支持 .trim()方法,如果你写了类似document.getElementByID().trim();的代码, ...

  6. 解决magento后台无法登陆/登陆没有反应的方法

    安装过magento的几个版本,安装好后在登陆后台的时候都遇到了点问题,用户名和密码都输入正确,就是登陆不了后台,经过研究发现,登陆不了后台的主要是因为magento自身缓存设置的问题,最模板解决方法 ...

  7. USB传输协议。——Arvin

    问题一:USB的传输线结构是如何的呢? 答案一:一条USB的传输线分别由地线.电源线.D+.D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源 ...

  8. C# 实现 Excel文件的数据导入

    前台 <asp:FileUpload ID="fuFile" runat="server" /> 后台 public string GetExcel ...

  9. 解决JS加载速度慢

    在网页中的js文件引用会很多,js引用通常为 <script src="xxxx.js"></script> 通过如下方法可以增加js加载速度 <sc ...

  10. openssl pem 生成公钥和私钥及文件

    openssl pem.h 中提供了关于pem格式密钥对的操作接口 通常使用.pem的格式文件来保存openssl 生成的密钥对: 在终端下 cat xxx.pem 可以看到 p.p1 { margi ...