博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring事务配置的五种方式
阅读量:6092 次
发布时间:2019-06-20

本文共 9669 字,大约阅读时间需要 32 分钟。

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。
    总结如下:
    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
    DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问 时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。
    具体如下图:
    根据代理机制的不同,总结了五种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();
    }
    
    
本文转自yunlielai51CTO博客,原文链接:http://blog.51cto.com/4925054/1117447,如需转载请自行联系原作者
}
你可能感兴趣的文章
XCode调试多线程遭遇海森伯效应一例
查看>>
ie6下浮动使绝对定位元素莫名消失的问题
查看>>
FBReaderJ 1.6.3 发布,Android 电子书阅读器
查看>>
Java编程常见问题汇总(四)
查看>>
Hadoop 学习系列(四)之 MapReduce 原理讲解
查看>>
函数throttle、debounce介绍
查看>>
源码阅读:SDWebImage(三)——NSData+ImageContentType
查看>>
十六、类的真正形态
查看>>
spring-cloud Sleuth
查看>>
Python 进阶之路 (十一) 再立Flag, 社区最全的itertools深度解析(下)
查看>>
微信分享,二次分享(移动web端)
查看>>
蚂蚁金服智能推荐引擎解决方案与实践
查看>>
PC比电脑好玩的秘密是什么?答案就是因为有这些神奇的网站!
查看>>
30秒的PHP代码片段(2)数学 - Math
查看>>
助力中文文字识别突破,美团公开首个真实场景招牌图像数据集
查看>>
IOS常用框架集合
查看>>
Laravel 深入核心系列教程
查看>>
webpack 性能提速
查看>>
一次下载多个文件的解决思路-JS
查看>>
记录使用Vue相关API开发项目时遇到的问题难点整理(不定时更新)
查看>>