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

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

hot3.png

    前段时间对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();
    }
    
    
}

转载于:https://my.oschina.net/jiefalcon/blog/126075

你可能感兴趣的文章
利用View静态画图
查看>>
Spring MVC
查看>>
不错的资源哦
查看>>
多线程概念
查看>>
emqttd 2.2安装和测试使用
查看>>
Objective-C之优雅的命名
查看>>
php output_buffering 缓存使用
查看>>
深度学习和神经网络的区别是什么
查看>>
Decorator模式
查看>>
每日练习
查看>>
LeetCode算法题-First Unique Character in a String(Java实现)
查看>>
【小程序】小程序开发自定义组件的步骤>>>>>>>>>小程序开发过程中报错:jsEnginScriptError...
查看>>
OSI模型
查看>>
用Quick Cocos2dx做一个连连看(三)
查看>>
好久没做.Net开发了,今天配置IIS和.Net Framework 4.0遇到点问题
查看>>
emoji情感分类器
查看>>
简单理解java反射机制
查看>>
Codeforces 399B - Red and Blue Balls
查看>>
实验五
查看>>
Qt资源
查看>>