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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值