Spring事务Transaction配置的五种注入方式详解
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。
总结如下:
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
具体如下图:

根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
第一种方式:每个Bean都有一个代理
01 |
<?xml version="1.0"encoding="UTF-8"?> |
06 |
xsi:schemaLocation="http://www.springframework.org/schema/beans |
07 |
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd |
08 |
http://www.springframework.org/schema/context |
09 |
http://www.springframework.org/schema/context/spring-context-2.5.xsd |
12 |
<bean id="sessionFactory" |
13 |
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> |
14 |
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> |
15 |
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> |
18 |
<!-- 定义事务管理器(声明式的事务) --> |
19 |
<bean id="transactionManager" |
20 |
class="org.springframework.orm.hibernate3.HibernateTransactionManager"> |
21 |
<property name="sessionFactory" ref="sessionFactory" /> |
25 |
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> |
26 |
<property name="sessionFactory" ref="sessionFactory" /> |
30 |
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> |
32 |
<property name="transactionManager" ref="transactionManager" /> |
33 |
<property name="target" ref="userDaoTarget" /> |
34 |
<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" /> |
36 |
<property name="transactionAttributes"> |
38 |
<prop key="*"> PROPAGATION_REQUIRED </prop> |
第二种方式:所有Bean共享一个代理基类
01 |
<?xml version="1.0"encoding="UTF-8"?> |
06 |
xsi:schemaLocation="http://www.springframework.org/schema/beans |
07 |
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd |
08 |
http://www.springframework.org/schema/context |
09 |
http://www.springframework.org/schema/context/spring-context-2.5.xsd |
12 |
<bean id="sessionFactory" |
13 |
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> |
14 |
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> |
15 |
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> |
18 |
<!-- 定义事务管理器(声明式的事务) --> |
19 |
<bean id="transactionManager" |
20 |
class="org.springframework.orm.hibernate3.HibernateTransactionManager"> |
21 |
<property name="sessionFactory" ref="sessionFactory" /> |
24 |
<bean id="transactionBase" |
25 |
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" |
26 |
lazy-init="true" abstract="true"> |
28 |
<property name="transactionManager" ref="transactionManager" /> |
30 |
<property name="transactionAttributes"> |
32 |
<prop key="*">PROPAGATION_REQUIRED </prop> |
38 |
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> |
39 |
<property name="sessionFactory" ref="sessionFactory" /> |
42 |
<bean id="userDao" parent="transactionBase"> |
43 |
<property name="target" ref="userDaoTarget" /> |
第三种方式:使用拦截器
01 |
<?xml version="1.0"encoding="UTF-8"?> |
06 |
xsi:schemaLocation="http://www.springframework.org/schema/beans |
07 |
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd |
08 |
http://www.springframework.org/schema/context |
09 |
http://www.springframework.org/schema/context/spring-context-2.5.xsd |
12 |
<bean id="sessionFactory" |
13 |
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> |
14 |
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> |
15 |
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> |
18 |
<!-- 定义事务管理器(声明式的事务) --> |
19 |
<bean id="transactionManager" |
20 |
class="org.springframework.orm.hibernate3.HibernateTransactionManager"> |
21 |
<property name="sessionFactory" ref="sessionFactory" /> |
24 |
<bean id="transactionInterceptor" |
25 |
class="org.springframework.transaction.interceptor.TransactionInterceptor"> |
26 |
<property name="transactionManager" ref="transactionManager" /> |
28 |
<property name="transactionAttributes"> |
30 |
<prop key="*">PROPAGATION_REQUIRED </prop> |
35 |
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> |
36 |
<property name="beanNames"> |
41 |
<property name="interceptorNames"> |
43 |
<value> transactionInterceptor </value> |
49 |
<bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl"> |
50 |
<property name="sessionFactory" ref="sessionFactory" /> |
第四种方式:使用tx标签配置的拦截器
01 |
<?xml version="1.0"encoding="UTF-8"?> |
07 |
xsi:schemaLocation="http://www.springframework.org/schema/beans |
08 |
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd |
09 |
http://www.springframework.org/schema/context |
10 |
http://www.springframework.org/schema/context/spring-context-2.5.xsd |
14 |
<context:annotation-config /> |
15 |
<context:component-scan base-package="com.bluesky" /> |
17 |
<bean id="sessionFactory" |
18 |
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> |
19 |
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> |
20 |
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> |
23 |
<!-- 定义事务管理器(声明式的事务) --> |
24 |
<bean id="transactionManager" |
25 |
class="org.springframework.orm.hibernate3.HibernateTransactionManager"> |
26 |
<property name="sessionFactory" ref="sessionFactory" /> |
29 |
<tx:advice id="txAdvice" transaction-manager="transactionManager"> |
31 |
<tx:method name="*" propagation="REQUIRED" /> |
36 |
<aop:pointcut id="interceptorPointCuts" |
37 |
expression="execution(*com.bluesky.spring.dao.*.*(..))" /> |
38 |
<aop:advisor advice-ref="txAdvice" |
39 |
pointcut-ref="interceptorPointCuts" /> |
第五种方式:全注解
01 |
<?xml version="1.0"encoding="UTF-8"?> |
07 |
xsi:schemaLocation="http://www.springframework.org/schema/beans |
08 |
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd |
09 |
http://www.springframework.org/schema/context |
10 |
http://www.springframework.org/schema/context/spring-context-2.5.xsd |
14 |
<context:annotation-config /> |
15 |
<context:component-scan base-package="com.bluesky" /> |
17 |
<tx:annotation-driven transaction-manager="transactionManager"/> |
19 |
<bean id="sessionFactory" |
20 |
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> |
21 |
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> |
22 |
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> |
25 |
<!-- 定义事务管理器(声明式的事务) --> |
26 |
<bean id="transactionManager" |
27 |
class="org.springframework.orm.hibernate3.HibernateTransactionManager"> |
28 |
<property name="sessionFactory" ref="sessionFactory" /> |
此时在DAO上需加上@Transactional注解,如下:
01 |
package com.bluesky.spring.dao; |
03 |
import java.util.List; |
05 |
import org.hibernate.SessionFactory; |
06 |
import org.springframework.beans.factory.annotation.Autowired; |
07 |
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; |
08 |
import org.springframework.stereotype.Component; |
10 |
import com.bluesky.spring.domain.User; |
13 |
@Component( " userDao " ) |
14 |
public class UserDaoImpl extends HibernateDaoSupport implements UserDao { |
16 |
public List <User> listUsers() { |
17 |
return this .getSession().createQuery( " from User " ).list(); |
- JavaScript五种继承方式详解
本文抄袭仅供学习http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html 一. 构造函数绑定 ...
- C++的三种继承方式详解以及区别
目录 目录 C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 前言 我发 ...
- 《网页设计基础——CSS的四种引入方式详解》
网页设计基础--CSS的四种引入方式详解 一.行内式: 规则: 1. 行内式是所有样式方法中最为直接的一种,它直接对HTML的标记使用style属性,然后将CSS代码直接写在其中. 格 ...
- python selenium 三种等待方式详解[转]
python selenium 三种等待方式详解 引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...
- Spring学习日记01_IOC_xml的三种注入方式
什么是IOC 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 使用IOC目的:为了耦合度降低 做入门案例就是IOC实现 IOC底层原理 xml解析 工厂模式 反射 原始方式 cla ...
- Spring 依赖注入方式详解
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
- Spring 依赖注入方式详解(四)
IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想 ...
- Spring IOC 注入方式详解 附代码
引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...
- SpringDI四种依赖注入方式详解
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!搜索关注微信公众号 [码出Offer] 领取各种学习资料! LOGO SpringDI(依赖注入) 一.DI概述 De ...
随机推荐
- Linux定时任务crontab每三秒执行一次shell
第一种方法:当然首先想到的是写一个触发的脚本,在触发脚本中使用死循环来解决此问题,如下: cat kick.sh #!/bin/bash while : ;do /home/somedir/scrip ...
- android studio引入第三方包记录
1.添加jar文件 将jar文件复制至app module目录下的libs文件夹下,然后打开app module目录下的build.gradle配置文件,在dependencies项中添加配置命令,这 ...
- window.print打印指定div实例代码
window.print可以打印网页,但有时候我们只希望打印特定控件或内容,怎么办呢,请看下面的例子 首先我们可以把要打印的内容放在div中,然后用下面的代码进行打印. 复制代码代码如下: <h ...
- Ubuntu 12.04 安装sougou for linux
安装sougou for linux: 1.卸载原有的输入法,fcitx或ibus.如卸载fcitx: sudo apt-get remove fcitx*(如不需保留配置文件用purge) sudo ...
- CorelDRAW 文件实用工具 CDRTools 2
随着 CorelDRAW 更新脚步越来越频繁,版本之间兼容性问题越来越突出,特别是跨版本之间打开会有很多问题,比如:文字跑位.透镜变向.位图出错.颜色改变,甚至会造成文件损坏.最好的办法就是哪一个版本 ...
- Kinetic使用注意点--group
new Group(config) 参数: config:包含所有配置项的对象. { x: "横坐标", y: "纵坐标", width: "宽度&q ...
- ios NavBar+TarBar技巧
NavBar+TarBar iphone开发 NavBar+TarBar 1 改变NavBar颜色:选中Navigation Bar 的Tint属性.选中颜色. 2 隐藏“back”按钮: sel ...
- (转载)Cocos2dx-OpenGL ES2.0教程:纹理贴图(6)
在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...
- filter_map
#!/usr/bin/env python # -*- coding:utf-8 -*- ret = filter( lambda x: x < 3, [1, 2, 3, 4, 5]) prin ...
- C# - dynamic 类型
C#4引入dynamic关键字,定义变量时,可以不初始化它的值. dynamic类型仅在编译期间存在,在运行期间会被System.Object类型替代. dynamic myDynamicVar; m ...