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 ...
随机推荐
- ios 数字禁止变成电话号码
1.使用meta来限制页面不转换电话号码 <meta name="format-detection"content="telphone=no"/> ...
- nodejs npm install全局安装和本地安装的区别
npm的包安装分为本地安装(local).全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如:代码如下:复制代码npm install # 本地安装npm install - ...
- php文件夹与文件目录操作函数
在php中一些常用的文件夹/文件目录操作函数总结. php文件夹操作函数 string basename ( string path [, string suffix] ) 给出一个包含有指向一个文件 ...
- 解决 windows2012 下无法安装 sql2008R2
Press the Windows logo key, type control panel, and then click the Control Panel icon. Note If you a ...
- oracle行转列、列转行
一.行转列 需要将如下格式 转换为: 这就是最常见的行转列,主要原理是利用decode函数.聚集函数(sum),结合group by分组实现的 create table test( id varcha ...
- 使用pd设计表的 多对多的中间表的设计方式, 有图有真相
设计多对多表时解决重复问题 目前流行两种设计方式: 方式一 是在中间表中建一个单独的id主键, 与业务表关联的键设置为unique唯一; 干事二: 联合主键的方式, 该方式中间表不会有与业务表无关的主 ...
- .NET 反射详解(转)
概述反射 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象. 反射机制允许程序在执行过程中动态地添加各种功能. 运行时类型标识 运行时类型标识(RTTI),可以在 ...
- 1202: [HNOI2005]狡猾的商人 - BZOJ
Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 ...
- idea14使用maven创建web工程
参考博客:http://geeksun.iteye.com/blog/2179658 http://www.bubuko.com/infodetail-387387.html ------------ ...
- Javascript字典操作
<script type="text/javascript"> var dic = new Array(); //注意它的类型是Array ...