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

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

    具体如下图:

Spring事务配置的五种方式_aop

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

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


<? 
 xml version="1.0" encoding="UTF-8" 
 ?> 
 
 
 < 
 beans  
 xmlns 
 ="http://www.springframework.org/schema/beans" 
 
    xmlns:xsi 
 ="http://www.w3.org/2001/XMLSchema-instance" 
 
    xmlns:context 
 ="http://www.springframework.org/schema/context" 
 
    xmlns:aop 
 ="http://www.springframework.org/schema/aop" 
 
 
     xsi:schemaLocation 
 ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" 
 > 
 

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

<? 
 xml version="1.0" encoding="UTF-8" 
 ?> 
 
 
 < 
 beans  
 xmlns 
 ="http://www.springframework.org/schema/beans" 
 
    xmlns:xsi 
 ="http://www.w3.org/2001/XMLSchema-instance" 
 
    xmlns:context 
 ="http://www.springframework.org/schema/context" 
 
    xmlns:aop 
 ="http://www.springframework.org/schema/aop" 
 
    xsi:schemaLocation 
 ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" 
 > 
 

     
 < 
 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 
 >

第三种方式:使用拦截器

<? 
 xml version="1.0" encoding="UTF-8" 
 ?> 
 
 
 < 
 beans  
 xmlns 
 ="http://www.springframework.org/schema/beans" 
 
    xmlns:xsi 
 ="http://www.w3.org/2001/XMLSchema-instance" 
 
    xmlns:context 
 ="http://www.springframework.org/schema/context" 
 
    xmlns:aop 
 ="http://www.springframework.org/schema/aop" 
 
 
     xsi:schemaLocation 
 ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" 
 > 
 

     
 < 
 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标签配置的拦截器


<? 
 xml version="1.0" encoding="UTF-8" 
 ?> 
 
 
 < 
 beans  
 xmlns 
 ="http://www.springframework.org/schema/beans" 
 
    xmlns:xsi 
 ="http://www.w3.org/2001/XMLSchema-instance" 
 
    xmlns:context 
 ="http://www.springframework.org/schema/context" 
 
    xmlns:aop 
 ="http://www.springframework.org/schema/aop" 
 
    xmlns:tx 
 ="http://www.springframework.org/schema/tx" 
 
    xsi:schemaLocation 
 ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" 
 > 
 

     
 < 
 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 
 >


第五种方式:全注解


<? 
 xml version="1.0" encoding="UTF-8" 
 ?> 
 
 
 < 
 beans  
 xmlns 
 ="http://www.springframework.org/schema/beans" 
 
    xmlns:xsi 
 ="http://www.w3.org/2001/XMLSchema-instance" 
 
    xmlns:context 
 ="http://www.springframework.org/schema/context" 
 
    xmlns:aop 
 ="http://www.springframework.org/schema/aop" 
 
    xmlns:tx 
 ="http://www.springframework.org/schema/tx" 
 
    xsi:schemaLocation 
 ="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" 
 > 
 

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

}