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. }

配置spring事务管理的几种方式(声明式事务)的更多相关文章

  1. 事务管理(下) 配置spring事务管理的几种方式(声明式事务)

    配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...

  2. Spring事务管理的四种方式(以银行转账为例)

    Spring事务管理的四种方式(以银行转账为例) 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败.   原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不 ...

  3. Spring事务管理的三种方式

    一 .第一种:全注解声明式事务 Xml代码 复制代码 收藏代码 .<?xml version="1.0" encoding="UTF-8"?> .& ...

  4. Spring事务管理之几种方式实现事务

    1.事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...

  5. Spring事务管理之几种方式实现事务(转)

    一:事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...

  6. 事务有哪些特性?spring的事务管理有几种方式实现,如何实现?

    特性:1.原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做 2.一致性:数据不会因为事务的执行而遭到破坏 3.隔离性:一个事物的执行,不受其他事务的干扰,即并发执行的事 ...

  7. Spring中事务管理的两种方式

    spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务 ...

  8. spring整合mybatis,ioc容器及声明式事务配置

    步骤: 1.创建jdbc.properties文件,用来管理存放连接数据库的相关信息 jdbc.properties:jdbc.user=root jdbc.password=123456 jdbc. ...

  9. Spring框架(三) JDBCTemplate,声明式事务,自动装载(注解)

    JDBCTemplate 按照标准正常项目的结构 结构图: model层 dao层 实现  dao:(DateBase Access Object) 数据访问对象,dao层只用来访问数据库和模型层 s ...

随机推荐

  1. HTML5实现下载文件且指定下载文件名

    <a href="/files/adlafjlxjewfasd89asd8f.pdf" download="预算表.pdf">下载</a> ...

  2. linux下使用sftp

    何为sftp sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法. 连接 linux下直接在终端中输入: sftp us ...

  3. RDIFramework.NET ━ 9.3 用户管理 ━ Web部分

    RDIFramework.NET ━ .NET快速信息化系统开发框架 9.3  用户管理 -Web部分 用户管理模块主要是对可登录系统的用户进行管理.后续的工作如:用户归属角色.权限的分配.用户所拥有 ...

  4. EBS创建相应的用户

    登陆EBS,依次点击"System Administrator"-->"Security"-->"User"-->&quo ...

  5. leetcode 374

    这个题目很简单,但是要注意细节和对题目的理解,一开始我把guess函数的作用理解错了,第一版代码长这样: int guessNumber(int n) { ; int high = n; while( ...

  6. JavaScript 设计模式之工厂模式

  7. java 除法向上,向下取整

    向上取整用Math.ceil(double a) 向下取整用Math.floor(double a) // 举例: double a=35; double b=20; double c = a/b; ...

  8. 将Cocos2dX渲染到MFC窗口上

    引用:http://www.cnblogs.com/windeer/archive/2012/11/18/2767750.html 引言 现在智能手机已经慢慢进入大众化,移动类应用开始火爆起来,游戏类 ...

  9. 思维导图软件MindManager for Windows中如何修改思维导图布局

    MindManager for Windows是 Mindjet公司旗下应用于Windows桌面系统的一款思维导图软件,目前已经更新到了v14版本.对于很多刚开始使用MindManager for W ...

  10. mysql常用操作语句(转)

      mysql -u root -p mysql -h localhost -u root -p database_name 2.列出数据库: show databases; 3.选择数据库: use ...