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 ...
随机推荐
- 让Dock自动 显示/隐藏 不再有延迟
Safari 5.2 Mac OS X 10.7.2 <ignore_js_op> 可能很多朋友使用Mac的时候都会选择将Dock隐藏(可以在系统偏好设置-Dock中选择),等到使用的时候 ...
- Editplus 中将文本换行替换为<p>标签的正则表达式
在Editplus.Notepad++编辑器里文本直接复制到在线编辑器里是不带<p>标签的,只是简单的将换行"\n"替换为"<br />" ...
- phpcms常用接口调用方法
常用函数 , 打开include/global.func.php,下面存放一些公共函数 view plaincopy to clipboardprint?function str_charset($i ...
- ECSHOP 支付宝发货确认接口,记录支付宝返回的交易号
1,在order_info 数据表尾添加trade_no 字段 数据表尾怎么添加trade_no 字段 ECSHOP为了支付宝发货确认接口,需要记录支付宝返回的交易号 1,在order_info 数据 ...
- 数据可视化(三)- Seaborn简易入门
本文内容来源:https://www.dataquest.io/mission/133/creating-compelling-visualizations 本文数据来源:http://www.cdc ...
- splObjectStroge的作用,实例化一个数组
PHP SPL SplObjectStorage是用来存储一组对象的,特别是当你需要唯一标识对象的时候. PHP SPL SplObjectStorage类实现了Countable,Iterator, ...
- android.support.v4.widget.DrawerLayout使用
activity_main.xml布局如下: <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas ...
- VB语言基础
一.常用的关键字 Dim Private Sub Public End If Else Form Me Single As Integer Unload Do While MessageBox等 二 ...
- drag drop小游戏
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 首页banner焦点图自动轮播效果
今天来介绍一下我前两天写一个小任务的时候遇到的一些问题,如果能够有所帮助或者启发,那将是我的荣幸. <div class="banner"> <a class=& ...