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();     
         }     
             
             
    }   

猜你喜欢

转载自longding.iteye.com/blog/2071087