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 ...
随机推荐
- php三维数组去重(示例代码)
php三维数组去重的示例代码. 假设叫数组 $my_array; <?php // 新建一个空的数组. $tmp_array = array(); $new_array = array(); ...
- [PHP]set_time_limit — 设置脚本最大执行时间
(PHP 4, PHP 5) set_time_limit — 设置脚本最大执行时间 说明 void set_time_limit ( int $seconds ) 设置允许脚本运行的时间,单位为秒. ...
- 破解网络投票IP限制、验证码限制、COokie限制、Seesion限制的方法!(转)
顾名思义,网络投票就是在网络上进行的投票活动,但和其他类型的投票不同的是:网络投票是建立在网络投票系统上的,而结果完全由程序输出,无需人工参与.这既是网络投票系统的优点也是其缺点,没有了人工的参与,其 ...
- Linux学习1
Linux中一切皆文件,且不依靠扩展名区分文件,学习Linux必须要熟悉在字符界面进行文件的管理. 首先是Linux的查询命令. (1)ls -a是显示当前目录所有文件,包含隐藏文件,如图中文件名前加 ...
- Python在Windows下开发环境配置汇总
最近比较关注学习Python方面的资料和课程,由于Python本身基本都是在Linux下开发,本人windows用习惯了初用Linux各种别扭啊. 下面将我在配置Windows环境下的禁言写出来,与大 ...
- LeetCode 解题报告--202Happy Number
1 题目描述 Write an algorithm to determine if a number is "happy". A happy number is a number ...
- 通过 struct 成员地址 获取 struct 结构体地址
1. 问题描述: 现在定义了一个结构体: struct Foo { int a; int b; }; Foo foo; 假如由于函数传参等原因,现在程序只能拿到 foo.b 的地址,这时想通过某种方法 ...
- [译] ASP.NET 生命周期 – ASP.NET 上下文对象(八)
使用 HttpResponse 对象 HttpResponse 对象是与 HttpRequest 对象相对应的,用来表示构建中的响应.它当中提供了方法和属性可供我们自定义响应,有一些在使用 MVC 视 ...
- SQL 跨服务器数据库增、删、改、查(一)
--开启本服务器中操作其他服务器的功能 reconfigure --输出消息 reconfigure --输出消息 --增 INSERT INTO OPENROWSET('SQLOLEDB','jx3 ...
- iOS 基础 第三天(0807)
0807 成员变量作用域###### 如下图所示: 这里要注意手写的成员变量/实例变量默认的作用域是private,所以外部指针类型的对象无法直接访问,这起到一定的保护作用.但可以在当前类内部@imp ...