前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。

总结如下:

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。

具体如下图:

根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:

第一种方式:每个Bean都有一个代理

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8. http://www.springframework.org/schema/context
  9. 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共享一个代理基类

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8. http://www.springframework.org/schema/context
  9. 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>

第三种方式:使用拦截器

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8. http://www.springframework.org/schema/context
  9. 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标签配置的拦截器

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  9. 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>

第五种方式:全注解

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  9. 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注解,如下:

  1. package com.bluesky.spring.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.hibernate.SessionFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  8. import org.springframework.stereotype.Component;
  9.  
  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.  
  20. }

[JavaEE] Spring事务配置的五种方式的更多相关文章

  1. Spring事务配置的五种方式(转发)

    Spring事务配置的五种方式(原博客地址是http://www.blogjava.net/robbie/archive/2009/04/05/264003.html)挺好的,收藏转发 前段时间对Sp ...

  2. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

    转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...

  3. Spring事务配置的五种方式(转载)

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...

  4. Spring事务配置的五种方式

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...

  5. Spring事务配置的五种方式 -- 越往后需要Spring版本越高

    第五种 基本零配置  个人感觉第四种也可以 Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式, ...

  6. Spring事务配置的五种方式(转)

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

  7. Spring事务配置的五种方式 巨全!不看后悔,一看必懂!

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

  8. (转)Spring事务配置的五种方式

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

  9. SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式

    这对时间在学习SSH中Spring架构,Spring的事务配置做了详细总结,在此之间对Spring的事务配置只是停留在听说的阶段,总结一下,整体把控,通过这次的学习发觉Spring的事务配置只要把思路 ...

随机推荐

  1. hadoop job history server

    默认情况下是没有启动的,需要配置完后手工启动服务. 1. 修改mapred-site.xml,添加如下内容(cluster mode, RM) <property>     <nam ...

  2. 时序分析:DTW算法(基于模板)

    对时序对象进行分析,使用KMP算法可以分析速率不变的模式,参考时序分析:欧式空间轨迹模式识别.使用基于模板匹配的方法,对于速率发生变化的模式,需要用新的对速率要求松散的方法,DTW方法为一种广泛使用的 ...

  3. 作业08之《MVC实现用户权限》

    1. 赋给用户一个userid,在用户角色表将用户和角色关联起来,在角色权限表中将角色和权限对应起来,权限表中存储的是左边菜单栏的名称. 2. 在判断权限时,通过用户的userid,获取其角色id,然 ...

  4. Swift Pointer 使用指南

    Overview C Syntax Swift Syntax Note const Type * UnsafePointer<Type> 指针可变,指针指向的内存值不可变. Type * ...

  5. 死磕itchat源码--core.py

    core.py文件中的Core类定义了itchat的所有接口.且,仅仅是定义了接口,全部在component包中实现重构.其用法如下表述: 缺省 源码如下: # -*- encoding: utf-8 ...

  6. GETDATE()

    定义和用法 GETDATE() 函数从 SQL Server 返回当前的时间和日期. 语法 GETDATE() 实例 例子 1 使用下面的 SELECT 语句: SELECT GETDATE() AS ...

  7. centos6.5 安装redis自动启动

    1.安装需要的支持环境 在安装Redis之前首要先做的是安装Unix的 Tcl工具 ,如果不安装的话后期将无法对Redis进行测试.在后期执行make test的时候返回如下错误信息: You nee ...

  8. Day5 练习

    1. 2. 要加强对代码效率的思考 3. 4. 知识点:1)多变量的同时赋值 2)元素的不可修改性:(1,2)=(3,4)与(a,b)= (b,a)     联想指针.地址去理解  :可用id()或t ...

  9. 谨慎调整内核参数:vm.min_free_kbytes

    内核参数:内存相关 内存管理从三个层次管理内存,分别是node, zone ,page; 64位的x86物理机内存从高地址到低地址分为: Normal DMA32 DMA.随着地址降低. [root@ ...

  10. Layui 行点击追加元素效果

    /** * 单击事件 * @param obj */var dom;var state;WarningIllegalIntime.onRowClick=function(obj) { console. ...