2019独角兽企业重金招聘Python工程师标准>>>

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动态代理来实现接口代理

转载于:https://my.oschina.net/chinaxy/blog/1827409

Spring 事务实现机制相关推荐

  1. spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?

    AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...

  2. 原创 | CRUD更要知道的Spring事务传播机制

    来自:肥朝 AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东 ...

  3. Spring事务传递机制和实现原理

    Spring事务传递机制和实现原理 实现原理 在实行事务的类或者方法上面添加@Transactional注解 Spring利用AOP思想机制,在方法执行前开启事务,在执行完成之后检查方法是否异常,根据 ...

  4. Spring事务传播机制以及事务嵌套

    Spring事务传播机制以及事务嵌套 Spring事务传播机制 事务嵌套场景 情景0: 场景1:不同类中,开启事务的方法调用没有开启事务的方法 场景2:不同类中,methodA方法嵌套methodB方 ...

  5. Spring事务传播机制和隔离级别

    Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非常的绕.如果栽在这上面,就实在是太可惜了. @Transactional(is ...

  6. Spring事务传播机制大白话(使用springboot,注解演示)

    1. 我对传播机制的理解 为什么需要传播机制? 因为事务之间可能存在相互调用,例如service业务层的方法存在相互调用,如果相互调用的方法都开启了事务(对应到springboot就是在方法上要添加@ ...

  7. Spring 事务传播机制 实例讲解

    事务传播机制 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spring的管理的事务可以分为如下2 ...

  8. Spring 事务管理机制概述

    摘要: 一般地,用户的每次请求都对应一个业务逻辑方法,而一个业务逻辑方法往往包括一系列数据库原子访问操作,并且这些数据库原子访问操作应该绑定成一个事务来执行.然而,在使用传统的事务编程策略时,程序代码 ...

  9. Spring事务管理机制

    Spring事务管理的四个优点: 提供一致的对于不同的事务管理的API 支持声明式事务管理(重点) 编程事务管理(在开发中应用比较少) 优秀的整合与Spring的数据访问 我们重点讲解spring的事 ...

  10. Java面试必问!Spring事务扩展机制(2)

    TransactionAspectSupport#invokeWithinTransaction TransactionAspectSupport#invokeWithinTransaction 是 ...

最新文章

  1. Linux 查看I/O端口地址分配
  2. Selenium爬携程酒店评论+jieba数据分析实战
  3. 语言的学习基础,100个经典的算法
  4. hibernate在分层架构中修改数据(update)时遇到的问题!!
  5. window中搭建jenkins_为容器化的 Go 程序搭建 CI
  6. Java基础(四)——异常、断言、日志
  7. 很WEB很2.0---ThunderBird
  8. requestparam的作用_POST/GET请求中RequestBody和RequestParam的应用场景
  9. 输出希腊字母表java
  10. 教你一键如何更换证件照底色?
  11. 树莓派查看CPU温度
  12. 腾讯混合云存储 TStor 系列再添新成员,并行存储一体机正式发布​
  13. 经典算法——韩信点兵问题的简单算法
  14. Android之CardView
  15. 数据预处理-python实现
  16. 七年级上学期计算机测试题,七年级英语上学期期末测试题及答案
  17. input只能输入英文
  18. 股票自动交易python下单接口_千股千评_个股最近30天专家点评_散户大家庭
  19. Unity——通过Shader 制作精灵动画,瀑布
  20. 黑龙江科技大学计算机分数,2017黑龙江科技大学录取分数线

热门文章

  1. 实现计算机和用户之间的关系,计算机系统概述
  2. 8月7日晚八点分享-推荐系统面试/概览
  3. Spring Cloud随记----远程配置文件资源库的建立-涉及一些简单的git操作
  4. android studio for android learning (六)应用程序窗体显示状态操作(requestWindowFeature等的应用)
  5. 【概率论】期望、方差、协方差、相关系数、相关与独立、样本估计量、点估计、区间估计
  6. 将Linux目录下的文件放到子目录中
  7. Raki的读paper小记:SUBSPACE REGULARIZERS FOR FEW-SHOT CLASS INCREMENTAL LEARNING
  8. 数据算法_数据结构和常用算法
  9. html遍历1到100,bat for循环100次:循环100求和
  10. 基于三台主机部署phpwind