spring事务管理-摘抄

时间:2022-08-29 13:14:38

原著网址 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事务管理-摘抄的更多相关文章

  1. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  2. spring事务管理器设计思想(二)

    上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...

  3. spring事务管理器设计思想(一)

    在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...

  4. 事务管理&lpar;下&rpar; 配置spring事务管理的几种方式&lpar;声明式事务&rpar;

    配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...

  5. Spring事务管理器的应对

    Spring抽象的DAO体系兼容多种数据访问技术,它们各有特色,各有千秋.像Hibernate是非常优秀的ORM实现方案,但对底层SQL的控制不太方便:而iBatis则通过模板化技术让你方便地控制SQ ...

  6. Spring事务管理(转)

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  7. &lbrack;Spring框架&rsqb;Spring 事务管理基础入门总结&period;

    前言:在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一 ...

  8. Spring 事务管理 01 ——

    目录: 参考: 1.Spring 事务管理高级应用难点剖析: 第 1 部分

  9. Spring 事务管理原理探究

    此处先粘贴出Spring事务需要的配置内容: 1.Spring事务管理器的配置文件: 2.一个普通的JPA框架(此处是mybatis)的配置文件: <bean id="sqlSessi ...

随机推荐

  1. 续 CentOS7&lpar;mini&rpar; 运行MVC5 &plus; Mariadb

    上一篇,介绍了在CentOS7上使用mono官方二进制安装包快速安装mono环境 并且成功运行了一个Owin自宿主应用(Booker) 由于Owin自宿主应用不需要System.Web的支持,所以可以 ...

  2. TJ2016 CTF Write up

    No zuo no die. Use markdown to write writeup in the future......

  3. &lpar;转&rpar;将cocos2dx项目从VS移植到Eclipse

    本文转自:http://www.cnblogs.com/Z-XML/p/3349518.html 引言:我们使用cocos2d-x引擎制作了一款飞行射击游戏,其中创新性地融入了手势识别功能.但是我 们 ...

  4. 并行编译 Xoreax IncrediBuild

    好东西... http://pan.baidu.com/s/1BtZ4s

  5. 【转载】绝对干货!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载九)如何通过源代码安装软件

    除了使用Linux的包管理机制进行软件的安装.更新和卸载,从源代码进行软件的安装也是非常常见的,开源软件提供了源代码包,开发者可以方便的通过源代码进行安装.从源码安装软件一般经过软件配置.编译软件.执 ...

  6. 代码规范-IAR设置

    1.在IAR内定义 char 2. 去掉相关的告警 3.LANGUAGE设置

  7. BZOJ2843&colon; 极地旅行社

    2843: 极地旅行社 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 90  Solved: 56[Submit][Status] Descripti ...

  8. wampserver里面出现403错误的问题解决方法

    今天再装wampserver的时候,不能进入localhost和phpmyadmin,提示403错误,我自己是win10系统,已通过以下方法解决了: 1.第一个问题,就是wampserver没有切换到 ...

  9. 电脑开机后,就会自动运行chkdsk,我想取消chkdsk,怎么取消

     每次开机都自动检查磁盘,检测通过后下次还是一样,NTFS/FAT32分区都有可能有这样的情况,即使重装系统,仍可能出现同样情况,但是硬盘可以通过Dell 随机带的检测程序解决方法:在命令行窗口中 ...

  10. 阿里云rds数据库迁移实战(多数据源)

    由于某几个业务表数据量太大,数据由业务写,数据部门读. 写压力不大,读却很容易导致长时间等待问题(读由单独系统进行读),导致连接被占用,从而容易并发稍稍增长导致全库卡死! 于是,就拆库呗. 业务系统拆 ...