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
10  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
11  
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" />
16  </bean>
17  
18  <!-- 定义事务管理器(声明式的事务) -->
19  <bean id="transactionManager"
20  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
21  <property name="sessionFactory" ref="sessionFactory" />
22  </bean>
23   
24  <!-- 配置DAO -->
25  <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
26  <property name="sessionFactory" ref="sessionFactory" />
27  </bean>
28   
29  <bean id="userDao"
30  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
31  <!-- 配置事务管理器 -->
32  <property name="transactionManager" ref="transactionManager" />
33  <property name="target" ref="userDaoTarget" />
34  <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
35  <!-- 配置事务属性 -->
36  <property name="transactionAttributes">
37  <props>
38  <prop key="*"> PROPAGATION_REQUIRED </prop>
39  </props>
40  </property>
41  </bean>
42  </beans>

    第二种方式:所有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
10  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
11  
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" />
16  </bean>
17  
18  <!-- 定义事务管理器(声明式的事务) -->
19  <bean id="transactionManager"
20  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
21  <property name="sessionFactory" ref="sessionFactory" />
22  </bean>
23   
24  <bean id="transactionBase"
25  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
26  lazy-init="true" abstract="true">
27  <!-- 配置事务管理器 -->
28  <property name="transactionManager" ref="transactionManager" />
29  <!-- 配置事务属性 -->
30  <property name="transactionAttributes">
31  <props>
32  <prop key="*">PROPAGATION_REQUIRED </prop>
33  </props>
34  </property>
35  </bean>
36   
37  <!-- 配置DAO -->
38  <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
39  <property name="sessionFactory" ref="sessionFactory" />
40  </bean>
41   
42  <bean id="userDao" parent="transactionBase">
43  <property name="target" ref="userDaoTarget" />
44  </bean>
45  </beans>

第三种方式:使用拦截器

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
10  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
11  
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" />
16  </bean>
17  
18  <!-- 定义事务管理器(声明式的事务) -->
19  <bean id="transactionManager"
20  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
21  <property name="sessionFactory" ref="sessionFactory" />
22  </bean>
23   
24  <bean id="transactionInterceptor"
25  class="org.springframework.transaction.interceptor.TransactionInterceptor">
26  <property name="transactionManager" ref="transactionManager" />
27  <!-- 配置事务属性 -->
28  <property name="transactionAttributes">
29  <props>
30  <prop key="*">PROPAGATION_REQUIRED </prop>
31  </props>
32  </property>
33  </bean>
34   
35  <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
36  <property name="beanNames">
37  <list>
38  <value> *Dao </value>
39  </list>
40  </property>
41  <property name="interceptorNames">
42  <list>
43  <value> transactionInterceptor </value>
44  </list>
45  </property>
46  </bean>
47   
48  <!-- 配置DAO -->
49  <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
50  <property name="sessionFactory" ref="sessionFactory" />
51  </bean>
52  </beans>

第四种方式:使用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
11  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
12  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
13  
14  <context:annotation-config />
15  <context:component-scan base-package="com.bluesky" />
16  
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" />
21  </bean>
22  
23  <!-- 定义事务管理器(声明式的事务) -->
24  <bean id="transactionManager"
25  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
26  <property name="sessionFactory" ref="sessionFactory" />
27  </bean>
28  
29  <tx:advice id="txAdvice" transaction-manager="transactionManager">
30  <tx:attributes>
31  <tx:method name="*" propagation="REQUIRED" />
32  </tx:attributes>
33  </tx:advice>
34   
35  <aop:config>
36  <aop:pointcut id="interceptorPointCuts"
37  expression="execution(*com.bluesky.spring.dao.*.*(..))" />
38  <aop:advisor advice-ref="txAdvice"
39  pointcut-ref="interceptorPointCuts" />
40  </aop:config>
41  </beans>

第五种方式:全注解

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
11  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
12  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
13  
14  <context:annotation-config />
15  <context:component-scan base-package="com.bluesky" />
16  
17  <tx:annotation-driven transaction-manager="transactionManager"/>
18  
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" />
23  </bean>
24  
25  <!-- 定义事务管理器(声明式的事务) -->
26  <bean id="transactionManager"
27  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
28  <property name="sessionFactory" ref="sessionFactory" />
29  </bean>
30   
31  </beans>

此时在DAO上需加上@Transactional注解,如下:

01 package com.bluesky.spring.dao;
02  
03  import java.util.List;
04  
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;
09  
10  import com.bluesky.spring.domain.User;
11  
12 @Transactional
13 @Component" userDao " )
14  public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
15  
16  public List <User> listUsers() {
17  return this .getSession().createQuery( " from User " ).list();
18  }
19 }

Spring事务Transaction配置的五种注入方式详解的更多相关文章

  1. JavaScript五种继承方式详解

    本文抄袭仅供学习http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html 一. 构造函数绑定 ...

  2. C++的三种继承方式详解以及区别

    目录 目录 C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 前言 我发 ...

  3. 《网页设计基础——CSS的四种引入方式详解》

    网页设计基础--CSS的四种引入方式详解     一.行内式:   规则: 1. 行内式是所有样式方法中最为直接的一种,它直接对HTML的标记使用style属性,然后将CSS代码直接写在其中.   格 ...

  4. python selenium 三种等待方式详解[转]

    python selenium 三种等待方式详解   引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...

  5. Spring学习日记01_IOC_xml的三种注入方式

    什么是IOC 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 使用IOC目的:为了耦合度降低 做入门案例就是IOC实现 IOC底层原理 xml解析 工厂模式 反射 原始方式 cla ...

  6. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  7. Spring 依赖注入方式详解(四)

    IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想 ...

  8. Spring IOC 注入方式详解 附代码

    引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...

  9. SpringDI四种依赖注入方式详解

    文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!搜索关注微信公众号 [码出Offer] 领取各种学习资料! LOGO SpringDI(依赖注入) 一.DI概述 De ...

随机推荐

  1. DTcms列表隔行换色;loop自带行号

    <%loop cdr2 bcategoryList%> <%if(cdr2__loop__id==1)%> <a class="no-bg" href ...

  2. PHP生成表格

    <?php /* DROP TABLE IF EXISTS `art`; CREATE TABLE `art` ( `id` int(11) NOT NULL AUTO_INCREMENT, ` ...

  3. 最简便的清空memcache的方法

    如果要清空memcache的items,常用的办法是什么?杀掉重启?如果有n台memcache需要重启怎么办?挨个做一遍? 很简单,假设memcached运行在本地的11211端口,那么跑一下命令行: ...

  4. The main roles of LTE eNodeB.

    eNB的功能包括: RRM(无线资源管理) IP头压缩 用户数据流加密 UE附着时的MME选择 寻呼信息的调度传输 广播信息的调度传输 设置和提供eNB的测量 CMC(连接移动性控制) 动态资源分配 ...

  5. pyunit实现数据测试框架

    PyUnit提供的动态方法,只编写一个测试类来完成对整个软件模块的测试,这样对象的初始化工作可以在setUp()方法中完成,而资源的释放则可以在tearDown()方法中完成. 使用PyUnit可以像 ...

  6. js 使用技巧 - [近几年工作中的经验总结的技巧]

    1.如果 ajax 返回单一的 json 格式,接收方需要这样再格式化一下赋值: var str = eval("(" + msg + ")"); 开发引用: ...

  7. insert into (select...WITH CHECK OPTION) values(...)

    insert into (<subquery> WITH CHECK OPTION) values (...) 语法看起来很特殊,其实是insert进subquery的这张表里: 1. 只 ...

  8. IOS开发之表视图添加索引

    我们要实现的效果如下. 1.修改ControlView.h,即添加变量dict,用于存储TabelView的数据源. #import <UIKit/UIKit.h> @interface  ...

  9. cocos2dx游戏资源加密之XXTEA

    在手机游戏当中,游戏的资源加密保护是一件很重要的事情. 我花了两天的时间整理了自己在游戏当中的资源加密问题,实现了跨平台的资源流加密,这个都是巨人的肩膀之上的. 大概的思路是这样的,游戏资源通过XXT ...

  10. C# Windows - ListView

    ListView控件的属性 属性 说明 Activation 控制用户在列表视图中激活选项的方式Standard - 用户为自己的计算机选择的值OneClick – 单击一个选项,激活它TwoClic ...