zoukankan      html  css  js  c++  java
  • Spring事务配置的五种方式

    原文地址:here
    Spring事务配置的五种方式 

        前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。 

        总结如下: 

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

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

        具体如下图: 
     

    Spring事务配置 (2) 

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

        第一种方式:每个Bean都有一个代理 
    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:context="http://www.springframework.org/schema/context"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    8.            http://www.springframework.org/schema/context  
    9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    10.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
    11.   
    12.     <bean id="sessionFactory"   
    13.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
    14.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />   
    15.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    16.     </bean>   
    17.   
    18.     <!-- 定义事务管理器(声明式的事务) -->   
    19.     <bean id="transactionManager"  
    20.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    21.         <property name="sessionFactory" ref="sessionFactory" />  
    22.     </bean>  
    23.      
    24.     <!-- 配置DAO -->  
    25.     <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">  
    26.         <property name="sessionFactory" ref="sessionFactory" />  
    27.     </bean>  
    28.      
    29.     <bean id="userDao"   
    30.         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   
    31.            <!-- 配置事务管理器 -->   
    32.            <property name="transactionManager" ref="transactionManager" />      
    33.         <property name="target" ref="userDaoTarget" />   
    34.          <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />  
    35.         <!-- 配置事务属性 -->   
    36.         <property name="transactionAttributes">   
    37.             <props>   
    38.                 <prop key="*">PROPAGATION_REQUIRED</prop>  
    39.             </props>   
    40.         </property>   
    41.     </bean>   
    42. </beans>  


        第二种方式:所有Bean共享一个代理基类 
    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:context="http://www.springframework.org/schema/context"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    8.            http://www.springframework.org/schema/context  
    9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    10.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
    11.   
    12.     <bean id="sessionFactory"   
    13.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
    14.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />   
    15.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    16.     </bean>   
    17.   
    18.     <!-- 定义事务管理器(声明式的事务) -->   
    19.     <bean id="transactionManager"  
    20.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    21.         <property name="sessionFactory" ref="sessionFactory" />  
    22.     </bean>  
    23.      
    24.     <bean id="transactionBase"   
    25.             class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"   
    26.             lazy-init="true" abstract="true">   
    27.         <!-- 配置事务管理器 -->   
    28.         <property name="transactionManager" ref="transactionManager" />   
    29.         <!-- 配置事务属性 -->   
    30.         <property name="transactionAttributes">   
    31.             <props>   
    32.                 <prop key="*">PROPAGATION_REQUIRED</prop>   
    33.             </props>   
    34.         </property>   
    35.     </bean>     
    36.     
    37.     <!-- 配置DAO -->  
    38.     <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">  
    39.         <property name="sessionFactory" ref="sessionFactory" />  
    40.     </bean>  
    41.      
    42.     <bean id="userDao" parent="transactionBase" >   
    43.         <property name="target" ref="userDaoTarget" />    
    44.     </bean>  
    45. </beans>  


    第三种方式:使用拦截器 
    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:context="http://www.springframework.org/schema/context"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    8.            http://www.springframework.org/schema/context  
    9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    10.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
    11.   
    12.     <bean id="sessionFactory"   
    13.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
    14.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />   
    15.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    16.     </bean>   
    17.   
    18.     <!-- 定义事务管理器(声明式的事务) -->   
    19.     <bean id="transactionManager"  
    20.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    21.         <property name="sessionFactory" ref="sessionFactory" />  
    22.     </bean>   
    23.     
    24.     <bean id="transactionInterceptor"   
    25.         class="org.springframework.transaction.interceptor.TransactionInterceptor">   
    26.         <property name="transactionManager" ref="transactionManager" />   
    27.         <!-- 配置事务属性 -->   
    28.         <property name="transactionAttributes">   
    29.             <props>   
    30.                 <prop key="*">PROPAGATION_REQUIRED</prop>   
    31.             </props>   
    32.         </property>   
    33.     </bean>  
    34.        
    35.     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
    36.         <property name="beanNames">   
    37.             <list>   
    38.                 <value>*Dao</value>  
    39.             </list>   
    40.         </property>   
    41.         <property name="interceptorNames">   
    42.             <list>   
    43.                 <value>transactionInterceptor</value>   
    44.             </list>   
    45.         </property>   
    46.     </bean>   
    47.    
    48.     <!-- 配置DAO -->  
    49.     <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">  
    50.         <property name="sessionFactory" ref="sessionFactory" />  
    51.     </bean>  
    52. </beans>  


    第四种方式:使用tx标签配置的拦截器 
    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:context="http://www.springframework.org/schema/context"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xmlns:tx="http://www.springframework.org/schema/tx"  
    7.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    9.            http://www.springframework.org/schema/context  
    10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    11.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
    12.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
    13.   
    14.     <context:annotation-config />  
    15.     <context:component-scan base-package="com.bluesky" />  
    16.   
    17.     <bean id="sessionFactory"   
    18.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
    19.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />   
    20.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    21.     </bean>   
    22.   
    23.     <!-- 定义事务管理器(声明式的事务) -->   
    24.     <bean id="transactionManager"  
    25.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    26.         <property name="sessionFactory" ref="sessionFactory" />  
    27.     </bean>  
    28.   
    29.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
    30.         <tx:attributes>  
    31.             <tx:method name="*" propagation="REQUIRED" />  
    32.         </tx:attributes>  
    33.     </tx:advice>  
    34.      
    35.     <aop:config>  
    36.         <aop:pointcut id="interceptorPointCuts"  
    37.             expression="execution(* com.bluesky.spring.dao.*.*(..))" />  
    38.         <aop:advisor advice-ref="txAdvice"  
    39.             pointcut-ref="interceptorPointCuts" />         
    40.     </aop:config>       
    41. </beans>  


    第五种方式:全注解 
    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:context="http://www.springframework.org/schema/context"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xmlns:tx="http://www.springframework.org/schema/tx"  
    7.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    9.            http://www.springframework.org/schema/context  
    10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    11.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
    12.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
    13.   
    14.     <context:annotation-config />  
    15.     <context:component-scan base-package="com.bluesky" />  
    16.   
    17.     <tx:annotation-driven transaction-manager="transactionManager"/>  
    18.   
    19.     <bean id="sessionFactory"   
    20.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
    21.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />   
    22.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    23.     </bean>   
    24.   
    25.     <!-- 定义事务管理器(声明式的事务) -->   
    26.     <bean id="transactionManager"  
    27.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    28.         <property name="sessionFactory" ref="sessionFactory" />  
    29.     </bean>  
    30.      
    31. </beans>  


    此时在DAO上需加上@Transactional注解,如下: 
    Java代码  收藏代码
    1. package com.dawnsky.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. }  
  • 相关阅读:
    jsp转向
    什么是 XDoclet?
    tomcat中的几点配置说明
    mysql5问题
    POJ 3734 Blocks
    POJ 2409 Let it Bead
    HDU 1171 Big Event in HDU
    POJ 3046 Ant Counting
    HDU 2082 找单词
    POJ 1286 Necklace of Beads
  • 原文地址:https://www.cnblogs.com/hlantian/p/10194581.html
Copyright © 2011-2022 走看看