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 ...
随机推荐
- SQL Server数据库连接类SQLHelper.cs
using System; using System.Collections.Generic; using System.Text; using System.Configuration; using ...
- 【转】 .NET中STAThread和MTAThread
ref:http://blog.csdn.net/dyllove98/article/details/9735955 1 COM中的公寓 本文讨论进程内COM组件.以一个示例直观演示STAThread ...
- [转]Linux/Unix系统镜像/备份/恢复 (dd 命令使用)
ref: http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=22561912&id=156879 开源系统默认安装了一个d ...
- JavaScript null and undefined
http://stackoverflow.com/questions/6429225/javascript-null-or-undefined var x; x == null // true x = ...
- [译]GC专家系列1: 理解Java垃圾回收
原文链接:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ 了解Java的垃圾回收(GC)原 ...
- php总结:1.php介绍
1.什么是php PHP,即“Hypertext Preprocessor”,是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中去.它的语法利用了 C.Java 和 P ...
- CentOS-6.5安装配置JDK-7|Tomcat-8
安装说明 系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7-linux-x64.rpm 下载地址:http://www.oracle.com/technetwork/java/j ...
- J2EE中文乱码处理
在JAVA WEB开发的过程中,经常会遇到中文乱码的情况,中文乱码主要是在浏览器与服务器交互传递数据的时候发生的.对于这个棘手的问题,我参考(韩顺平老师)视频将处理方法总结与此,供自己以及大家开发的时 ...
- C++ 编写 CorelDRAW CPG 插件例子(1)—WelcomeScreen
据我所知,这是国外论坛最早的一个例子,原贴在此:http://forum.oberonplace.com/showthread.php?t=1880&highlight=Plugins 贴上主 ...
- FPGA初学心得
有三种方法在模块中产生逻辑:1.使用连续赋值语句“assign”:2.用实例元件 3.用“always”块.所以在always块中赋值不能使用assign,而是直接给变量赋值就行. reg与wire的 ...