当前位置: Coin163 >>

spring声明式事务配置方式总结

2013-12-13 | 所属分类:spring 事务 配置

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

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

    详细如下图:

spring

 

 

第一种方式:使用拦截器,比较常用

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

 

第三种:每个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"
    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 >

在需要拦截的bean实现上需加上@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();
    }

}  

 

 

关于Coin163网站地图

Copyright 2012-2013 Coin163.com ( Coin163 ) All Rights Reserved