`
zengshaotao
  • 浏览: 787233 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring五种事务配置方式(转)

 
阅读更多

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

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

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

 

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

  1. <bean id="sessionFactory"       
  2.            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">       
  3.        <property name="configLocation" value="classpath:hibernate.cfg.xml" />       
  4.        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />     
  5.    </bean>       
  6.     
  7.    <!-- 定义事务管理器(声明式的事务) -->       
  8.    <bean id="transactionManager"    
  9.        class="org.springframework.orm.hibernate3.HibernateTransactionManager">     
  10.        <property name="sessionFactory" ref="sessionFactory" />     
  11.    </bean>     
  12.         
  13.    <!-- 配置DAO -->     
  14.    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">     
  15.        <property name="sessionFactory" ref="sessionFactory" />     
  16.    </bean>     
  17.         
  18.    <bean id="userDao"       
  19.        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">       
  20.           <!-- 配置事务管理器 -->       
  21.           <property name="transactionManager" ref="transactionManager" />          
  22.        <property name="target" ref="userDaoTarget" />       
  23.         <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />     
  24.        <!-- 配置事务属性 -->       
  25.        <property name="transactionAttributes">       
  26.            <props>       
  27.                <prop key="*">PROPAGATION_REQUIRED</prop>     
  28.            </props>       
  29.        </property>       
  30.    </bean>       
  31. lt;/beans>    
<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>     
lt;/beans>  


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

  1. <bean id="sessionFactory"       
  2.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">       
  3.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />       
  4.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />     
  5.     </bean>       
  6.     
  7.     <!-- 定义事务管理器(声明式的事务) -->       
  8.     <bean id="transactionManager"    
  9.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">     
  10.         <property name="sessionFactory" ref="sessionFactory" />     
  11.     </bean>     
  12.          
  13.     <bean id="transactionBase"       
  14.             class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"       
  15.             lazy-init="true" abstract="true">       
  16.         <!-- 配置事务管理器 -->       
  17.         <property name="transactionManager" ref="transactionManager" />       
  18.         <!-- 配置事务属性 -->       
  19.         <property name="transactionAttributes">       
  20.             <props>       
  21.                 <prop key="*">PROPAGATION_REQUIRED</prop>       
  22.             </props>       
  23.         </property>       
  24.     </bean>         
  25.         
  26.     <!-- 配置DAO -->     
  27.     <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">     
  28.         <property name="sessionFactory" ref="sessionFactory" />     
  29.     </bean>     
  30.          
  31.     <bean id="userDao" parent="transactionBase" >       
  32.         <property name="target" ref="userDaoTarget" />        
  33.     </bean>     
  34. </beans>    
<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>  


第三种:使用拦截器

  1. <bean id="sessionFactory"       
  2.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">       
  3.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />       
  4.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />     
  5.     </bean>       
  6.     
  7.     <!-- 定义事务管理器(声明式的事务) -->       
  8.     <bean id="transactionManager"    
  9.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">     
  10.         <property name="sessionFactory" ref="sessionFactory" />     
  11.     </bean>      
  12.         
  13.     <bean id="transactionInterceptor"       
  14.         class="org.springframework.transaction.interceptor.TransactionInterceptor">       
  15.         <property name="transactionManager" ref="transactionManager" />       
  16.         <!-- 配置事务属性 -->       
  17.         <property name="transactionAttributes">       
  18.             <props>       
  19.                 <prop key="*">PROPAGATION_REQUIRED</prop>       
  20.             </props>       
  21.         </property>       
  22.     </bean>     
  23.            
  24.     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">       
  25.         <property name="beanNames">       
  26.             <list>       
  27.                 <value>*Dao</value>     
  28.             </list>       
  29.         </property>       
  30.         <property name="interceptorNames">       
  31.             <list>       
  32.                 <value>transactionInterceptor</value>       
  33.             </list>       
  34.         </property>       
  35.     </bean>       
  36.        
  37.     <!-- 配置DAO -->     
  38.     <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">     
  39.         <property name="sessionFactory" ref="sessionFactory" />     
  40.     </bean>     
  41. </beans>    
<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标签配置的拦截器

  1. <context:annotation-config />     
  2.    <context:component-scan base-package="com.bluesky" />     
  3.     
  4.    <bean id="sessionFactory"       
  5.            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">       
  6.        <property name="configLocation" value="classpath:hibernate.cfg.xml" />       
  7.        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />     
  8.    </bean>       
  9.     
  10.    <!-- 定义事务管理器(声明式的事务) -->       
  11.    <bean id="transactionManager"    
  12.        class="org.springframework.orm.hibernate3.HibernateTransactionManager">     
  13.        <property name="sessionFactory" ref="sessionFactory" />     
  14.    </bean>     
  15.     
  16.    <tx:advice id="txAdvice" transaction-manager="transactionManager">     
  17.        <tx:attributes>     
  18.            <tx:method name="*" propagation="REQUIRED" />     
  19.        </tx:attributes>     
  20.    </tx:advice>     
  21.         
  22.    <aop:config>     
  23.        <aop:pointcut id="interceptorPointCuts"    
  24.            expression="execution(* com.bluesky.spring.dao.*.*(..))" />     
  25.        <aop:advisor advice-ref="txAdvice"    
  26.            pointcut-ref="interceptorPointCuts" />             
  27.    </aop:config>           
  28. lt;/beans>    
<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>         
lt;/beans>  


全注解:

  1. <context:annotation-config />     
  2.     <context:component-scan base-package="com.bluesky" />     
  3.     
  4.     <tx:annotation-driven transaction-manager="transactionManager"/>     
  5.     
  6.     <bean id="sessionFactory"       
  7.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">       
  8.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />       
  9.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />     
  10.     </bean>       
  11.     
  12.     <!-- 定义事务管理器(声明式的事务) -->       
  13.     <bean id="transactionManager"    
  14.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">     
  15.         <property name="sessionFactory" ref="sessionFactory" />     
  16.     </bean>     
  17.          
  18. </beans>    
<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注解

  1. package com.bluesky.spring.dao;     
  2.     
  3. import java.util.List;     
  4.     
  5. import org.hibernate.SessionFactory;     
  6. import org.springframework.beans.factory.annotation.Autowired;     
  7. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;     
  8. import org.springframework.stereotype.Component;     
  9.     
  10. import com.bluesky.spring.domain.User;     
  11.     
  12. @Transactional    
  13. @Component("userDao")     
  14. public class UserDaoImpl extends HibernateDaoSupport implements UserDao {     
  15.     
  16.     public List<User> listUsers() {     
  17.         return this.getSession().createQuery("from User").list();     
  18.     }     
  19.          
  20.          
  21. }   
分享到:
评论

相关推荐

    spring事务配置的五种方式

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

    Spring事务配置的五种方式

    下面将详细介绍这五个主要的事务配置方式。 1. **每个Bean都有一个代理** 在这种配置方式中,每个需要事务管理的Bean都会有一个事务代理。通过`TransactionProxyFactoryBean`创建代理,每个业务逻辑方法都将在事务...

    spring五种事务配置demo

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

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

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

    spring 的3种事务配置方式

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

    Spring的事务配置的五种方式

    Spring框架在处理事务时提供了五种不同的配置方式,这些配置主要涉及到事务的声明式管理和编程式管理。在Spring中,事务管理通常分为三部分:DataSource、TransactionManager和代理机制。DataSource是数据源,...

    Spring声明式事务配置管理方法

    Spring声明式事务配置管理方法

    spring事务配置的5中方式

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

    Spring的五种事务配置方式[参照].pdf

    以下是对Spring五种事务配置方式的详细说明: 1. **基于XML的声明式事务管理**: - 第一种配置方式是为每个Bean创建一个代理,这通常涉及使用`&lt;tx:annotation-driven/&gt;`或`&lt;aop:config&gt;`元素。在给定的示例中,`...

    spring声明式事务配置

    根据提供的信息,我们可以深入探讨Spring框架中的声明式事务配置及其多种实现方式。声明式事务管理是一种简化事务管理的方式,它允许开发人员通过配置而非编程来指定事务边界,从而减少了代码的复杂性并提高了可维护...

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

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

    spring3.0两种事务管理配置

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

    spring+ibatis事务的配置

    很好的spring+ibatis事务的配置文档.

    Spring事务配置的五种方式.doc

    Spring事务配置的五种方式 Spring框架中事务配置是非常重要的一部分,通常由三个组成部分组成,即DataSource、TransactionManager和代理机制。无论采取何种配置方式,代理机制部分总是变化的,而DataSource和...

Global site tag (gtag.js) - Google Analytics