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

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

 

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

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

 

   
   
   
   
  1. xml version="1.0" encoding="UTF-8"?> 
  2.  
  3.     <bean id="sessionFactory"   
  4.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  5.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />   
  6.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
  7.     bean>   
  8.  
  9.        
  10.     <bean id="transactionManager" 
  11.         class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
  12.         <property name="sessionFactory" ref="sessionFactory" /> 
  13.     bean> 
  14.      
  15.      
  16.     <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> 
  17.         <property name="sessionFactory" ref="sessionFactory" /> 
  18.     bean> 
  19.      
  20.     <bean id="userDao"   
  21.         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   
  22.               
  23.            <property name="transactionManager" ref="transactionManager" />      
  24.         <property name="target" ref="userDaoTarget" />   
  25.          <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" /> 
  26.            
  27.         <property name="transactionAttributes">   
  28.             <props>   
  29.                 <prop key="*">PROPAGATION_REQUIREDprop> 
  30.             props>   
  31.         property>   
  32.     bean>   
  33. beans> 

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

 

    
    
    
    
  1. xml version="1.0" encoding="UTF-8"?> 
  2.     <bean id="sessionFactory"   
  3.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  4.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />   
  5.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
  6.     bean>   
  7.  
  8.        
  9.     <bean id="transactionManager" 
  10.         class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
  11.         <property name="sessionFactory" ref="sessionFactory" /> 
  12.     bean> 
  13.      
  14.     <bean id="transactionBase"   
  15.             class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"   
  16.             lazy-init="true" abstract="true">   
  17.            
  18.         <property name="transactionManager" ref="transactionManager" />   
  19.            
  20.         <property name="transactionAttributes">   
  21.             <props>   
  22.                 <prop key="*">PROPAGATION_REQUIREDprop>   
  23.             props>   
  24.         property>   
  25.     bean>     
  26.     
  27.      
  28.     <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> 
  29.         <property name="sessionFactory" ref="sessionFactory" /> 
  30.     bean> 
  31.      
  32.     <bean id="userDao" parent="transactionBase" >   
  33.         <property name="target" ref="userDaoTarget" />    
  34.     bean> 
  35. beans> 

第三种方式:使用拦截器

 

     
     
     
     
  1. xml version="1.0" encoding="UTF-8"?> 
  2.     <bean id="sessionFactory"   
  3.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  4.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />   
  5.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
  6.     bean>   
  7.  
  8.        
  9.     <bean id="transactionManager" 
  10.         class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
  11.         <property name="sessionFactory" ref="sessionFactory" /> 
  12.     bean>  
  13.     
  14.     <bean id="transactionInterceptor"   
  15.         class="org.springframework.transaction.interceptor.TransactionInterceptor">   
  16.         <property name="transactionManager" ref="transactionManager" />   
  17.            
  18.         <property name="transactionAttributes">   
  19.             <props>   
  20.                 <prop key="*">PROPAGATION_REQUIREDprop>   
  21.             props>   
  22.         property>   
  23.     bean> 
  24.        
  25.     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
  26.         <property name="beanNames">   
  27.             <list>   
  28.                 <value>*Daovalue> 
  29.             list>   
  30.         property>   
  31.         <property name="interceptorNames">   
  32.             <list>   
  33.                 <value>transactionInterceptorvalue>   
  34.             list>   
  35.         property>   
  36.     bean>   
  37.    
  38.      
  39.     <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl"> 
  40.         <property name="sessionFactory" ref="sessionFactory" /> 
  41.     bean> 
  42. 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. 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> 



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




 

        
        
        
        
  1. package com.test.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 listUsers() { 
  17.         return this.getSession().createQuery("from User").list(); 
  18.     } 
  19.      
  20.