Spring 事务实现机制
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 事务实现机制相关推荐
- spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?
AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...
- 原创 | CRUD更要知道的Spring事务传播机制
来自:肥朝 AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东 ...
- Spring事务传递机制和实现原理
Spring事务传递机制和实现原理 实现原理 在实行事务的类或者方法上面添加@Transactional注解 Spring利用AOP思想机制,在方法执行前开启事务,在执行完成之后检查方法是否异常,根据 ...
- Spring事务传播机制以及事务嵌套
Spring事务传播机制以及事务嵌套 Spring事务传播机制 事务嵌套场景 情景0: 场景1:不同类中,开启事务的方法调用没有开启事务的方法 场景2:不同类中,methodA方法嵌套methodB方 ...
- Spring事务传播机制和隔离级别
Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非常的绕.如果栽在这上面,就实在是太可惜了. @Transactional(is ...
- Spring事务传播机制大白话(使用springboot,注解演示)
1. 我对传播机制的理解 为什么需要传播机制? 因为事务之间可能存在相互调用,例如service业务层的方法存在相互调用,如果相互调用的方法都开启了事务(对应到springboot就是在方法上要添加@ ...
- Spring 事务传播机制 实例讲解
事务传播机制 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spring的管理的事务可以分为如下2 ...
- Spring 事务管理机制概述
摘要: 一般地,用户的每次请求都对应一个业务逻辑方法,而一个业务逻辑方法往往包括一系列数据库原子访问操作,并且这些数据库原子访问操作应该绑定成一个事务来执行.然而,在使用传统的事务编程策略时,程序代码 ...
- Spring事务管理机制
Spring事务管理的四个优点: 提供一致的对于不同的事务管理的API 支持声明式事务管理(重点) 编程事务管理(在开发中应用比较少) 优秀的整合与Spring的数据访问 我们重点讲解spring的事 ...
- Java面试必问!Spring事务扩展机制(2)
TransactionAspectSupport#invokeWithinTransaction TransactionAspectSupport#invokeWithinTransaction 是 ...
最新文章
- Linux 查看I/O端口地址分配
- Selenium爬携程酒店评论+jieba数据分析实战
- 语言的学习基础,100个经典的算法
- hibernate在分层架构中修改数据(update)时遇到的问题!!
- window中搭建jenkins_为容器化的 Go 程序搭建 CI
- Java基础(四)——异常、断言、日志
- 很WEB很2.0---ThunderBird
- requestparam的作用_POST/GET请求中RequestBody和RequestParam的应用场景
- 输出希腊字母表java
- 教你一键如何更换证件照底色?
- 树莓派查看CPU温度
- 腾讯混合云存储 TStor 系列再添新成员,并行存储一体机正式发布​
- 经典算法——韩信点兵问题的简单算法
- Android之CardView
- 数据预处理-python实现
- 七年级上学期计算机测试题,七年级英语上学期期末测试题及答案
- input只能输入英文
- 股票自动交易python下单接口_千股千评_个股最近30天专家点评_散户大家庭
- Unity——通过Shader 制作精灵动画,瀑布
- 黑龙江科技大学计算机分数,2017黑龙江科技大学录取分数线
热门文章
- 实现计算机和用户之间的关系,计算机系统概述
- 8月7日晚八点分享-推荐系统面试/概览
- Spring Cloud随记----远程配置文件资源库的建立-涉及一些简单的git操作
- android studio for android learning (六)应用程序窗体显示状态操作(requestWindowFeature等的应用)
- 【概率论】期望、方差、协方差、相关系数、相关与独立、样本估计量、点估计、区间估计
- 将Linux目录下的文件放到子目录中
- Raki的读paper小记:SUBSPACE REGULARIZERS FOR FEW-SHOT CLASS INCREMENTAL LEARNING
- 数据算法_数据结构和常用算法
- html遍历1到100,bat for循环100次:循环100求和
- 基于三台主机部署phpwind