首页 > 其他分享 >spring事务概要

spring事务概要

时间:2023-06-08 21:05:26浏览次数:48  
标签:事务管理 事务 概要 spring J2EE bean Spring property



Spring框架是一个2003年2月才出现的 开源项目,该开源项目起源自Rod Johnson在2002年末出版的《Expert One-on-One J2EE Design and Development》一书中的 基础性 代码。在该书中,Rod Johnson倡导J2EE实用主义的设计思想,而Spring框架正是这一思想的更全面和具体的实现。Spring框架由一个容器,一个配置和组织组件 的框架,和一组内置的为事务、持久化和Web用户接口提供的服务组成。作为一种轻量级的J2EE框架,Spring提供了一种有效的方式来建立和组织 J2EE应用程序。

Spring特性

IoC(Inversion of Control;控制反转);又称DI(Dependency Injection;依赖注入);是 面向对象领 域新兴的编程思想;也是Spring的精髓所在。简单地说;IoC就是指程序之间的关系由容器来控制;而不是传统实现中由程序代码直接操控。这也就是所谓 “控制反转”的概念所在:控制权由应用代码转到外部容器,控制权的转移,也就是所谓的反转。IoC将控制创建的职责搬进了框架中;并把它从应用代码脱离开 来。当使用Spring的IoC容器时只需指出组件需要的对象,在运行时Spring的IoC容器会根据XML配置数据提供给它。

Spring IoC,借助于依赖注入设计模式,使得 开发者 不用理会对象自身的生命周期及其关系,而且能够改善开发者对模式的使用。对于一个对象的管理不是什么困难,难就难在对整个对象群的管理。依赖注入可以让容 器管理对象,即“Don’t call me, I will call you”。这样对象本身的生命周期以及对象之间的关系就不再让开发者费神了。

Spring AOP,借助于Spring实现拦截器,开发者能够实现以声名方式使用企业级服务,比如安全性服务、事务服务。AOP 合理的补充了OOP,借助于Spring AOP,开发者能够高效的使用J2EE服务。

Spring服务抽象,借助于各种J2EE API抽象,使得开发者能够一致地使用J2EE 技术,而不管具体是使用什么J2EE API,借助于Spring服务抽象,使代码大大减少,满足“更少代码,更少BUG”的软件设计原则。

Spring IoC+Spring AOP+Spring服务抽象,一起形成Spring,这样一个有机体,使构建轻量级J2EE成为可能。

Spring提供的事务管理

Spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活方便。

1、传统使用JDBC的事务管理

以往使用JDBC进行数据操作,使用DataSource,从数据源中得到Connection,我们知道数据源是 线程安全的,而连接不是线程安全的,所以对每个请求都是从数据源中重新取出一个连接。一般的数据源由容器进行管理,包括连接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等这些J2EE商业容器都提供了这个功能。

以往的我们使用JDBC在写代码时,事务管理可能会是这样:


Connection conn = null;
 
try{ 
 
conn = DBConnectionFactory.getConnection;
 
conn.setAutoCommit(false); //do something
 
conn.commit(); //commit transcation
 
}catch(Exception e){ 
 
conn.rollback();
 
}finally{ 
 
try{
 
conn.close();
 
}catch(SQLException se){
 
//do sth.
 
} 
 
//close ResultSet,PreparedStatement,Connection
 
//notice:Maybe ocurr Exception when u close rs,pstmt,conn
 
}


按照以往的思路来写代码,代码量比较长,而且容易疏忽,忘掉一些try/catch,引发一些异常无法catch,虽然有时候我们会写DBTool类,来关闭这些资源,并且保证在关闭这些资源时,不向外抛异常,但是这样做会导致额外的麻烦。

2、Spring提供的编程式的事务处理

Spring提供了几个关于事务处理的类:

TransactionDefinition //事务属性定义

TranscationStatus //代表了当前的事务,可以提交,回滚。

PlatformTransactionManager 这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们 使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

我们使用编程式的事务管理流程可能如下:

(1) 声明数据源。

(2) 声明一个事务管理类,例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等

(3) 在我们的代码中加入事务处理代码:

TransactionDefinition td = new TransactionDefinition();
 
TransactionStatus ts = transactionManager.getTransaction(td);
 
try{ 
 
//do sth transactionManager.commit(ts);
 
}catch(Exception e){transactionManager.rollback(ts);
 
}



使用Spring提供的事务模板TransactionTemplate:


void add(){ 
 
transactionTemplate.execute( new TransactionCallback(){
 
public Object doInTransaction(TransactionStatus ts){
 
//do sth}
 
}}


TransactionTemplate也是为我们省去了部分事务提交、回滚代码;定义事务模板时,需注入事务管理对象。

3、Spring声明式事务处理

Spring声明式事务处理也主要使用了IoC,AOP思想,提供了TransactionInterceptor拦截器和常用的代理类TransactionProxyFactoryBean,可以直接对组件进行事务代理。

使用TransactionInterceptor的步骤:

(1)定义数据源,事务管理类

(2)定义事务拦截器,例如:


<bean id = "transactionInterceptor"
 
class="org.springframework.transaction.interceptor.TransactionInterceptor">
 
<property name="transactionManager">
 
<ref bean="transactionManager"/></property>
 
<property name="transactionAttributeSource">
 
<value>com.test.UserManager.*r=PROPAGATION_REQUIRED</value>
 
</property>
 
</bean>




(3)为组件声明一个代理类:ProxyFactoryBean


<bean id="userManager"
 
class="org.springframework.aop.framework.ProxyFactoryBean">
 
<property name="proxyInterfaces">
 
<value>com.test.UserManager</value>
 
</property>
 
<property name="interceptorNames">
 
<list><idref local="transactionInterceptor"/></list>
 
</property>
 
</bean>




使用TransactionProxyFactoryBean:

<bean id="userManager"
 
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
 
<property name="transactionManager">
 
<ref bean="transactionManager"/>
 
</property>
 
<property name="target"><ref local="userManagerTarget"/></property>
 
<property name="transactionAttributes"><props>
 
<prop key="insert*">PROPAGATION_REQUIRED</prop>
 
<prop key="update*">PROPAGATION_REQUIRED</prop>
 
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
 
</props>
 
</property></bean>



TransactionProxyFactoryBean 只是为组件的事务代理,如果我们要给组件添加一些业务方面的验证等,可以使用TransactionTemplate加拦截器方式,为组件添加多个拦截 器,spring AOP中提供了三类Advice,即前增强,后增强,抛出异常时的增强,可以灵活使用。

结束语

Spring可以简单的把普通的 java class纳入事务管理,声明性的事务操作起来也很容易。有了Spring之后,声明性事务不再是 EJB独有,我们不必为了获得声明性事务的功能而去忍受EJB带来的种种不便。Spring还提供了惟一的事务管理抽象,它能够在各种底层事务管理技术(如JTA或者JDBC)之上提供一个一致的编程模型。

标签:事务管理,事务,概要,spring,J2EE,bean,Spring,property
From: https://blog.51cto.com/u_16065168/6443260

相关文章

  • JAVA的springboot+vue学习平台管理系统,校园在线学习管理系统,附源码+数据库+论文+PPT
    1、项目介绍在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括学习平台的网络应用,在外国学习平台已经是很普遍的方式,不过国内的管理平台可能还处于起步阶段。学习平台具有学习信息管理功能的选择。学习平台采用java技术,基于springboot框架,mysql数据库进行......
  • 【转载】CXF spring jaxws:endpoint jaxws:server 区别 与 关系
    通过spring配置实现webservice的配置有两种,一种是jaxws:endpoint ,另外一种是jaxws:server。百度上没查到相关区别,又由于本人没有跟代码,所以又google了一下,才找到:First,theyareallfortheserversideconfiguration.Second,jaxws:endpointiscomingfromJAXWSAPI,a......
  • 转载:Spring 框架的设计理念与设计模式分析
    Spring框架的设计理念与设计模式分析<!--LEADSPACE_BODY_END--><!--SUMMARY_BEGIN-->Spring作为现在最优秀的框架之一,已被广泛的使用,并且有很多对其分析的文章。本文将从另外一个视角试图剖析出Spring框架的作者设计Spring框架的骨骼架构的设计理念,有那几个核心组件?为......
  • spring cloud单点登录
    概述基于springcloud的单点登录服务及基于zuul的网关服务(解决了通过zuul转发到认证服务之后session丢失问题)详细一、准备工作学习前请先系统的学习一下eureka、zuul、springsecurity,否则上手可能会比较困难,我当时买的《springcloud微服务实战》,这本书写的还不错。......
  • springMVC集成缓存框架Ehcache
    概述Ehcache算是当前比较流行的缓存框架,使用缓存可以极大的缓解服务器和数据库的压力,提高访问效率,提高服务器的并发能力。接下来我们看怎么把缓存在springmvc种使用起来。详细Ehcache算是当前比较流行的缓存框架,使用缓存可以极大的缓解服务器和数据库的压力,提高访问......
  • SpringBootServletInitializer 的作用
    SpringBootServletInitializer 是一个SpringBoot提供的用于配置Servlet初始化器的类。它继承自Spring的 SpringServletContainerInitializer 类,实现了 WebApplicationInitializer 接口,因此可以在Servlet容器启动时自动被加载,并生成一个servlet容器的配置类,用于初......
  • SpringBootServletInitializer 的作用
    SpringBootServletInitializer 是一个SpringBoot提供的用于配置Servlet初始化器的类。它继承自Spring的 SpringServletContainerInitializer 类,实现了 WebApplicationInitializer 接口,因此可以在Servlet容器启动时自动被加载,并生成一个servlet容器的配置类,用于初......
  • SpringBootServletInitializer 的作用
    SpringBootServletInitializer 是一个SpringBoot提供的用于配置Servlet初始化器的类。它继承自Spring的 SpringServletContainerInitializer 类,实现了 WebApplicationInitializer 接口,因此可以在Servlet容器启动时自动被加载,并生成一个servlet容器的配置类,用于初始......
  • SpringBootServletInitializer 的作用
    SpringBootServletInitializer 是一个SpringBoot提供的用于配置Servlet初始化器的类。它继承自Spring的 SpringServletContainerInitializer 类,实现了 WebApplicationInitializer 接口,因此可以在Servlet容器启动时自动被加载,并生成一个servlet容器的配置类,用于初始......
  • xxl-job的部署及springboot集成使用
    介绍XXL-Job是一个分布式任务调度平台,可进行任务调度、管理和监控,并提供任务分片、失败重试、动态分配等功能。它是一个开源项目,基于SpringBoot和Quartz开发,支持常见的任务调度场景。XXL-Job的使用相对简单,只需要简单配置即可实现任务调度。同时,它提供了丰富的管理和监控功能,可以......