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事务原理、Spring事务配置的五种方式
Spring事务原理.txt
主要带领大家深入理解Spring事务原理,Spring事务的传播属性
主要介绍了Spring事务处理原理步骤详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
此ppt中前半部分通过spring事务的60道题的测试,摸底对事务的掌握情况,后半部分,对spring中的事务属性(传播行为、隔离级别、回滚规则、事务超时、是否只读)进行说明
Spring事务传播原理及数据库事务操作原理.rar
Spring事务实践 事务锁 嵌套事务设计原理
Spring声明式事务管理失效的原因,这里面是日常工作中踩过的坑,事务失效所产生的影响比较隐蔽,测试时易忽略,大多是在线上暴露,这可能是对Spring管理下的信任吧
各框架的组各下来,版本就特别的多,针对简单的 使用注解来管理事务的,研究了两天,要不网上写的不清楚,要不版本都很旧了,所以就是不回滚,Spring 的配置太灵活了,在加上新手,根本就不可能明白Spring的原理,...
Spring事务执行原理流程图.pdf
1.Spring入门和IOC介绍 2.对象依赖 3.AOP入门 4.JDBCTemplate和Spring事务 5.Spring事务原理 6.Spring事务的一个线程安全问题 7.IOC再回顾和面试题 8.AOP再回顾
包括内容:Spring体系结构、Spring重要接口讲解(BeanFactory继承体系、BeanDefinition继承体系、ApplicationContext继承体系)、IOC/DI(容器初始化流源码分析)、AOP原理(解析流程,代理流程,执行流程)、事务...
介绍下,注解方式为例子配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional 标识。Spring 在启动的时候会去解析生成相关的 bean
spring事务_案例_PPT 一、事务传播机制的demo案例,内容包括: 1.业务代码列举7种事务传播机制的情况,每个测试方法都附带日志分析记录、使用场景和实际场景,小白也能看得懂!!! 2.在测试类Test包下,使用juniter...
主要给大家介绍了关于Spring中事务用法示例及实现原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Spring Boot实战与原理分析视频课程包含14-18,本视频教程为网络整理,如有侵权,请联系删除。谢谢 Spring Boot实战与原理分析视频课程 课程目录: 1 Spring Boot概述与课程概要介绍20:33 2 Spring4 快速入门59:56...
主要介绍了spring事务Propagation及其实现原理详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
本文首先会使用实例进行讲解Spring事务事件是如何使用的,然后会讲解这种使用方式的实现原理。感兴趣的朋友跟随小编一起看看吧
Spring注解驱动开发第35讲——声明式事务原理的源码分析
此外,Spring事务管理器支持多种类型的事务策略,包括不同的传播行为和隔离级别,允许开发者根据具体业务场景选择最合适的事务管理策略。深入理解Spring声明式事务的工作原理,不仅能帮助开发者更高效地使用Spring...