spring事務的5種配置方式

  轉載:http://sosuny.iteye.com/blog/451961

Spring配置文件中關於事務配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,無論哪種配置方式,一般變化的只是代理機制這部分。

    DataSource、TransactionManager這兩部分只是會根據數據訪問方式有所變化,比如使用Hibernate進行數據訪問 時,DataSource實際爲SessionFactory,TransactionManager的實現爲 HibernateTransactionManager。

    具體如下圖:

Spring事務配置 (2)

    根據代理機制的不同,總結了五種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();
    }
    
    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章