`
longding
  • 浏览: 2669 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

spring事务管理方式

 
阅读更多
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。 根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:

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

    <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共享一个代理基类
    <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>   

第三种方式:使用拦截器
    <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标签配置的拦截器
    <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>   

第五种方式:全注解
    <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事务管理Demo

    首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 1. **编程式事务管理**:通过使用`PlatformTransactionManager`接口及其实现类(如`JdbcTemplate`或`HibernateTemplate`),开发者...

    Java框架笔试题(含答案).docx

    Spring 事务管理方式包括编程方式和声明式两种方式。编程式采用的方式可以控制事务的边界,而声明式采用配置 xml 方式,将事务管理与实际业务代码解耦。 六、Spring 框架概述 Spring 是一个轻量级框架,简化了 ...

    详细介绍Spring事务管理

    #### 四、Spring事务管理方式 Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ##### 1. 编程式事务管理 编程式事务管理需要开发者在代码中明确地管理事务的生命周期。这种方式更加灵活,...

    Spring事务管理开发必备jar包

    2. **Spring事务管理**:Spring提供了两种事务管理方式,即编程式事务管理和声明式事务管理。编程式事务管理通过TransactionTemplate或直接调用PlatformTransactionManager接口的方法来管理事务,而声明式事务管理则...

    spring事务管理几种方式代码实例

    spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...

    Spring事务管理的jar包

    Spring事务管理分为编程式事务管理和声明式事务管理两种方式。编程式事务管理通过使用PlatformTransactionManager接口的begin、commit、rollback等方法直接控制事务的生命周期,这种方式灵活但容易导致代码过于繁琐...

    spring 事务管理的理解

    Spring 提供了两种事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理:这是通过编写代码来控制事务的开始、提交和回滚。Spring 提供了PlatformTransactionManager接口,如...

    Spring事务管理失效原因汇总

    标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...

    spring事务管理5种方法

    声明式事务管理是Spring最常用的事务管理方式,它通过在配置文件或者注解中声明事务边界,将事务管理与业务代码分离。具体分为两种: - XML配置:在Spring的配置文件中,可以使用`&lt;tx:advice&gt;`定义事务处理规则,...

    spring事务管理

    通过上述示例可以看出,Spring事务管理不仅支持编程式事务管理,还提供了更为简便的声明式事务管理方式。在实际开发中,应根据项目需求选择合适的事务管理方式。对于简单的业务逻辑,建议优先考虑声明式事务管理;而...

    Spring事务管理4种方式

    本文将详细介绍Spring事务管理的四种方式:编程式事务管理、声明式事务管理、PlatformTransactionManager接口以及TransactionTemplate。 1. **编程式事务管理**:这是一种手动控制事务的方式,通过在代码中调用`...

    Spring事务管理.pdf

    Spring事务管理.pdf 1.资料 2.本地事务与分布式事务 3.编程式模型 4.宣告式模型

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。

    实验 spring 声明事务

    同时,Spring还提供了编程式事务管理,允许开发者在代码中手动管理事务,但这种方式通常在更复杂的场景或特殊需求下使用。 通过这个实验,学生可以深入理解Spring声明式事务管理的工作原理,以及如何在实际项目中...

    Spring事务管理的三种方式

    本篇文章将详细探讨Spring中的三种事务管理方式:编程式事务管理、声明式事务管理和基于注解的事务管理。 首先,编程式事务管理是通过编码来控制事务的开始、提交、回滚等操作。Spring提供了...

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

    Spring事务管理创造性的解决了很多以前要用重量级的应用服务器才能解决的事务问题,那么其实现原理一定很深奥吧?可是如果读者仔细研究了Spring事务管理的代码以后就会发现,事务管理其实也是如此简单的事情。这也...

    Spring事务流程图

    Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一...

    spring事务操作试验

    在描述中提到的博客文章中,作者可能详细讲解了如何配置和使用这两种事务管理方式。通常,声明式事务管理是首选,因为它更简洁且易于维护。例如,可以使用@Transactional注解在方法级别声明一个事务,该方法内的所有...

Global site tag (gtag.js) - Google Analytics