`

spring事务的5种配置方式

阅读更多

  转载:http://sosuny.iteye.com/blog/451961

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

    DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问 时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。

    具体如下图:

Spring事务配置 (2)

    根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:

   

第一种方式:每个Bean都有一个代理

<!----><? xml version="1.0" encoding="UTF-8" ?> 
< beans xmlns ="http://www.springframework.org/schema/beans" 
    xmlns:xsi
 ="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context
 ="http://www.springframework.org/schema/context" 
    xmlns:aop
 ="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
 > 

    
< bean id ="sessionFactory"   
            class
 ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >   
        
< property name ="configLocation" value ="classpath:hibernate.cfg.xml"   />   
        
< property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration"   /> 
    
</ bean >   

    
<!-- 定义事务管理器(声明式的事务) -->   
    
< bean id ="transactionManager" 
        class
 ="org.springframework.orm.hibernate3.HibernateTransactionManager" > 
        
< property name ="sessionFactory" ref ="sessionFactory"   /> 
    
</ bean > 
    
    
<!-- 配置DAO --> 
    
< bean id ="userDaoTarget" class ="com.bluesky.spring.dao.UserDaoImpl" > 
        
< property name ="sessionFactory" ref ="sessionFactory"   /> 
    
</ bean > 
    
    
< bean id ="userDao"   
        class
 ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >   
           
<!-- 配置事务管理器 -->   
           
< property name ="transactionManager" ref ="transactionManager"   />      
        
< property name ="target" ref ="userDaoTarget"   />   
         
< property name ="proxyInterfaces" value ="com.bluesky.spring.dao.GeneratorDao"   /> 
        
<!-- 配置事务属性 -->   
        
< property name ="transactionAttributes" >   
            
< props >   
                
< prop key ="*" > PROPAGATION_REQUIRED </ prop > 
            
</ props >   
        
</ property >   
    
</ bean >   
</ beans >

  

  第二种方式:所有Bean共享一个代理基类

<!----><? xml version="1.0" encoding="UTF-8" ?> 
< beans xmlns ="http://www.springframework.org/schema/beans" 
    xmlns:xsi
 ="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context
 ="http://www.springframework.org/schema/context" 
    xmlns:aop
 ="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation
 ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
 > 

    
< bean id ="sessionFactory"   
            class
 ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >   
        
< property name ="configLocation" value ="classpath:hibernate.cfg.xml"   />   
        
< property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration"   /> 
    
</ bean >   

    
<!-- 定义事务管理器(声明式的事务) -->   
    
< bean id ="transactionManager" 
        class
 ="org.springframework.orm.hibernate3.HibernateTransactionManager" > 
        
< property name ="sessionFactory" ref ="sessionFactory"   /> 
    
</ bean > 
    
    
< bean id ="transactionBase"   
            class
 ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"   
            lazy-init
 ="true" abstract ="true" >   
        
<!-- 配置事务管理器 -->   
        
< property name ="transactionManager" ref ="transactionManager"   />   
        
<!-- 配置事务属性 -->   
        
< property name ="transactionAttributes" >   
            
< props >   
                
< prop key ="*" > PROPAGATION_REQUIRED </ prop >   
            
</ props >   
        
</ property >   
    
</ bean >     
   
    
<!-- 配置DAO --> 
    
< bean id ="userDaoTarget" class ="com.bluesky.spring.dao.UserDaoImpl" > 
        
< property name ="sessionFactory" ref ="sessionFactory"   /> 
    
</ bean > 
    
    
< bean id ="userDao" parent ="transactionBase"   >   
        
< property name ="target" ref ="userDaoTarget"   />    
    
</ bean > 
</ beans >

第三种方式:使用拦截器(非常常用)

<!----><? xml version="1.0" encoding="UTF-8" ?> 
< beans xmlns ="http://www.springframework.org/schema/beans" 
    xmlns:xsi
 ="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context
 ="http://www.springframework.org/schema/context" 
    xmlns:aop
 ="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
 > 

    
< bean id ="sessionFactory"   
            class
 ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >   
        
< property name ="configLocation" value ="classpath:hibernate.cfg.xml"   />   
        
< property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration"   /> 
    
</ bean >   

    
<!-- 定义事务管理器(声明式的事务) -->   
    
< bean id ="transactionManager" 
        class
 ="org.springframework.orm.hibernate3.HibernateTransactionManager" > 
        
< property name ="sessionFactory" ref ="sessionFactory"   /> 
    
</ bean >  
   
    
< bean id ="transactionInterceptor"   
        class
 ="org.springframework.transaction.interceptor.TransactionInterceptor" >   
        
< property name ="transactionManager" ref ="transactionManager"   />   
        
<!-- 配置事务属性 -->   
        
< property name ="transactionAttributes" >   
            
< props >   
                
< prop key ="*" > PROPAGATION_REQUIRED </ prop >   
            
</ props >   
        
</ property >   
    
</ bean > 
      
    
< bean class ="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >   
        
< property name ="beanNames" >   
            
< list >   
                
< value > *Dao </ value > 
            </ list >   
        
</ property >   
        
< property name ="interceptorNames" >   
            
< list >   
                
< value > transactionInterceptor </ value >   
            
</ list >   
        
</ property >   
    
</ bean >   
  
    
<!-- 配置DAO --> 
    
< bean id ="userDao" class ="com.bluesky.spring.dao.UserDaoImpl" > 
        
< property name ="sessionFactory" ref ="sessionFactory"   /> 
    
</ bean > 
</ beans >

第四种方式:使用tx标签配置的拦截器(常用)

<!----><? xml version="1.0" encoding="UTF-8" ?> 
< beans xmlns ="http://www.springframework.org/schema/beans" 
    xmlns:xsi
 ="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context
 ="http://www.springframework.org/schema/context" 
    xmlns:aop
 ="http://www.springframework.org/schema/aop" 
    xmlns:tx
 ="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation
 ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
 > 

    
< context:annotation-config /> 
    
< context:component-scan base-package ="com.bluesky"   /> 

    
< bean id ="sessionFactory"   
            class
 ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >   
        
< property name ="configLocation" value ="classpath:hibernate.cfg.xml"   />   
        
< property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration"   /> 
    
</ bean >   

    
<!-- 定义事务管理器(声明式的事务) -->   
    
< bean id ="transactionManager" 
        class
 ="org.springframework.orm.hibernate3.HibernateTransactionManager" > 
        
< property name ="sessionFactory" ref ="sessionFactory"   /> 
    
</ bean > 

    
< tx:advice id ="txAdvice" transaction-manager ="transactionManager" > 
        
< tx:attributes > 
            
< tx:method name ="*" propagation ="REQUIRED"   /> 
        
</ tx:attributes > 
    
</ tx:advice > 
    
    
< aop:config > 
        
< aop:pointcut id ="interceptorPointCuts" 
            expression
 ="execution(* com.bluesky.spring.dao.*.*(..))"   /> 
        
< aop:advisor advice-ref ="txAdvice" 
            pointcut-ref
 ="interceptorPointCuts"   />         
    
</ aop:config >       
</ beans >

第五种方式:全注解

<!---->
<!----><? xml version="1.0" encoding="UTF-8" ?> 
< beans xmlns ="http://www.springframework.org/schema/beans" 
    xmlns:xsi
 ="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context
 ="http://www.springframework.org/schema/context" 
    xmlns:aop
 ="http://www.springframework.org/schema/aop" 
    xmlns:tx
 ="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation
 ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
 > 

    
< context:annotation-config /> 
    
< context:component-scan base-package ="com.bluesky"   /> 

    
< tx:annotation-driven transaction-manager ="transactionManager" /> 

    
< bean id ="sessionFactory"   
            class
 ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >   
        
< property name ="configLocation" value ="classpath:hibernate.cfg.xml"   />   
        
< property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration"   /> 
    
</ bean >   

    
<!-- 定义事务管理器(声明式的事务) -->   
    
< bean id ="transactionManager" 
        class
 ="org.springframework.orm.hibernate3.HibernateTransactionManager" > 
        
< property name ="sessionFactory" ref ="sessionFactory"   /> 
    
</ bean > 
    
</ beans >

此时在DAO上需加上@Transactional注解,如下:

<!---->package com.bluesky.spring.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

import com.bluesky.spring.domain.User;

@Transactional
@Component(
 " userDao " )
public   class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    
public List < User > listUsers() {
        
return   this .getSession().createQuery( " from User " ).list();
    }
    
    
}

 

分享到:
评论

相关推荐

    spring事务配置的五种方式

    ### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要的一部分,特别是在涉及多个数据库操作时。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务处理方式。...

    Spring事务配置的五种方式

    Spring 事务配置是Spring框架中不可或缺的部分,它用于管理和协调应用程序中的事务边界,确保数据的一致性和完整性。在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager以及代理机制。...

    spring事务配置的5中方式

    下面将详细介绍Spring的五种事务配置方式。 1. **基于XML的事务配置** - **每个Bean都有一个代理**: 在这种配置方式中,每个需要事务管理的Bean都会有一个对应的代理Bean。例如,对于DAO层的UserDao,我们首先...

    Spring事务原理、Spring事务配置的五种方式

    Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两个核心:...

    详细说明spring事务配置的5种方式

    本文将详细介绍Spring事务配置的五种方式,帮助你深入理解如何在Spring应用中管理事务。 1. **基于XML的声明式事务管理** 第一种方式是在每个Bean上使用代理来实现事务管理。首先,配置`DataSource`,通常是`...

    spring3.0两种事务管理配置

    Spring 3.0 提供了两种事务管理配置方法:基于 XML 的事务管理和基于 @Transactional 的事务管理,这两种方法都是为了实现事务管理的目标,分别具有不同的配置方式和优缺点。 基于 XML 的事务管理 这种方法不需要...

    spring几种事务配置详解【精】

    本文将深入探讨Spring中的几种事务配置方式,帮助开发者更好地理解和运用。 1. **编程式事务管理** 编程式事务管理是在代码中显式调用事务API来控制事务的开始、提交、回滚等操作。这种方式直接在业务逻辑代码中...

    spring配置事务五种方式.doc

    这样,带有@Transactional注解的类或方法将会自动地被Spring事务代理处理。 3. **编程式事务管理** 编程式事务管理允许在代码中显式地开始、提交、回滚事务。使用PlatformTransactionManager接口的实现,如...

    spring 的3种事务配置方式

    本文将详细介绍Spring中的三种事务配置方式:编程式事务管理、声明式事务管理以及基于注解的事务管理。 **1. 编程式事务管理** 编程式事务管理是通过编程的方式手动控制事务的开始、提交、回滚等操作。主要使用`...

    spring五种事务配置demo

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...

    Spring事务五种不同的代理配置

    每种事务配置方式都有其适用场景和优缺点。第一种方式需要手动配置事务规则,而第二、三种方式通过注解简化了配置,第四种方式适用于不依赖接口的情况,第五种方式则提供了最大的灵活性。在实际开发中,我们通常会...

    Spring事务配置5种方式

    总结来说,Spring的事务配置可以通过调整DataSource、TransactionManager以及代理机制中的事务属性来适应不同的数据访问技术和事务需求。通过上述的配置方式,Spring能够灵活地管理事务,保证了业务操作的一致性和...

    Spring的事务配置的五种方式

    Spring框架在处理事务时提供了五种不同的配置方式,这些配置主要涉及到事务的声明式管理和编程式管理。在Spring中,事务管理通常分为三部分:...在实际应用中,应根据项目需求和性能考虑选择合适的事务配置方式。

    Spring事务管理的几种配置方式,

    Spring提供了多种事务管理配置方式,适合不同的应用场景。本篇将详细讲解Spring中的事务管理配置,帮助初学者理解并掌握这一重要概念。 1. 声明式事务管理 声明式事务管理是Spring中最常用的事务管理方式,它通过...

    Spring配置的5种方式

    接下来,我们将详细介绍五种不同的Spring事务配置方式。 #### 三、事务配置的第一种方式:每个Bean都有一个代理 这种方式下,每一个需要事务管理的方法或类都会有一个代理。示例配置如下: ```xml ...

    Spring基于XML方式配置事务

    这里我们主要探讨的是"Spring基于XML方式配置事务",这涉及到Spring的事务管理器、事务属性以及如何在XML配置文件中定义这些元素。 首先,Spring的事务管理分为两种模式:编程式事务管理和声明式事务管理。编程式...

Global site tag (gtag.js) - Google Analytics