当前位置: 首页 > 编程笔记 >

详解Spring配置事务的五种方式

皇甫俊雅
2023-03-14
本文向大家介绍详解Spring配置事务的五种方式,包括了详解Spring配置事务的五种方式的使用技巧和注意事项,需要的朋友参考一下

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

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

具体如下图:

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

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

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 
 
http://www.springframework.org/schema/context
 
 
http://www.springframework.org/schema/context/spring-context-2.5.xsd
 
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 
<bean id="sessionFactory"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
</bean> 
<!-- 定义事务管理器(声明式的事务) --> 
<bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<!-- 配置DAO --> 
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<bean id="userDao"
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
<!-- 配置事务管理器 --> 
<property name="transactionManager" ref="transactionManager" /> 
<property name="target" ref="userDaoTarget" /> 
<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" /> 
<!-- 配置事务属性 --> 
<property name="transactionAttributes"> 
<props> 
<prop key="*">PROPAGATION_REQUIRED</prop> 
</props> 
</property> 
</bean> 
</beans>

第二种方式:所有Bean共享一个代理基类

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 
 
http://www.springframework.org/schema/context
 
 
http://www.springframework.org/schema/context/spring-context-2.5.xsd
 
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 
<bean id="sessionFactory"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
</bean> 
<!-- 定义事务管理器(声明式的事务) --> 
<bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<bean id="transactionBase"
   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
   lazy-init="true" abstract="true"> 
<!-- 配置事务管理器 --> 
<property name="transactionManager" ref="transactionManager" /> 
<!-- 配置事务属性 --> 
<property name="transactionAttributes"> 
<props> 
<prop key="*">PROPAGATION_REQUIRED</prop> 
</props> 
</property> 
</bean> 
<!-- 配置DAO --> 
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<bean id="userDao" parent="transactionBase" > 
<property name="target" ref="userDaoTarget" /> 
</bean> 
</beans>

第三种方式:使用拦截器

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 
 
http://www.springframework.org/schema/context
 
 
http://www.springframework.org/schema/context/spring-context-2.5.xsd
 
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 
<bean id="sessionFactory"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
</bean> 
<!-- 定义事务管理器(声明式的事务) --> 
<bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<bean id="transactionInterceptor"
  class="org.springframework.transaction.interceptor.TransactionInterceptor"> 
<property name="transactionManager" ref="transactionManager" /> 
<!-- 配置事务属性 --> 
<property name="transactionAttributes"> 
<props> 
<prop key="*">PROPAGATION_REQUIRED</prop> 
</props> 
</property> 
</bean> 
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
<property name="beanNames"> 
<list> 
<value>*Dao</value> 
</list> 
</property> 
<property name="interceptorNames"> 
<list> 
<value>transactionInterceptor</value> 
</list> 
</property> 
</bean> 
<!-- 配置DAO --> 
<bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
</beans>

第四种方式:使用tx标签配置的拦截器

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 
 
http://www.springframework.org/schema/context
 
 
http://www.springframework.org/schema/context/spring-context-2.5.xsd
 
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
<context:annotation-config /> 
<context:component-scan base-package="com.bluesky" /> 
<bean id="sessionFactory"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
</bean> 
<!-- 定义事务管理器(声明式的事务) --> 
<bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
<tx:attributes> 
<tx:method name="*" propagation="REQUIRED" /> 
</tx:attributes> 
</tx:advice> 
<aop:config> 
<aop:pointcut id="interceptorPointCuts"
   expression="execution(* com.bluesky.spring.dao.*.*(..))" /> 
<aop:advisor advice-ref="txAdvice"
   pointcut-ref="interceptorPointCuts" /> 
</aop:config> 
</beans>

第五种方式:全注解

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 
 
http://www.springframework.org/schema/context
 
 
http://www.springframework.org/schema/context/spring-context-2.5.xsd
 
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
<context:annotation-config /> 
<context:component-scan base-package="com.bluesky" /> 
<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="sessionFactory"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
</bean> 
<!-- 定义事务管理器(声明式的事务) --> 
<bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
</beans>

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

package com.mktao.spring.dao; 
import java.util.List; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 
import org.springframework.stereotype.Component; 
import com.bluesky.spring.domain.User; 
@Transactional
@Component("userDao") 
public class UserDaoImpl extends HibernateDaoSupport implements UserDao { 
public List<User> listUsers() { 
return this.getSession().createQuery("from User").list(); 
 } 
... 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Spring事务Transaction配置的五种注入方式详解,包括了Spring事务Transaction配置的五种注入方式详解的使用技巧和注意事项,需要的朋友参考一下 前段时间对spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。 总结如下: S

  • 本文向大家介绍详解spring 配置的两种方式:JAVA配置和注解配置,包括了详解spring 配置的两种方式:JAVA配置和注解配置的使用技巧和注意事项,需要的朋友参考一下 众所周知,spring自从3.0开始以后,就全面推荐使用配置的方式进行代码编写了,这种方式确实可以避免了之前一个项目里面一大堆XML的情况,毕竟XML的可读性实在不怎么样,而且一会写JAVA,一会写XML,确实还是蛮麻烦的

  • 本文向大家介绍Spring中的事务操作、注解及XML配置详解,包括了Spring中的事务操作、注解及XML配置详解的使用技巧和注意事项,需要的朋友参考一下 事务 事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割。例如我们的转账这个业务,就需要进行数据库事务的处理。 转账中至少会涉及到两条 SQL 语句: 上面这两条 SQL 就可以要看成

  • 本文向大家介绍详解PHP实现定时任务的五种方法,包括了详解PHP实现定时任务的五种方法的使用技巧和注意事项,需要的朋友参考一下 定时运行任务对于一个网站来说,是一个比较重要的任务,比如定时发布文档,定时清理垃圾信息等,现在的网站大多数都是采用PHP动态语言开发的,而对于PHP的实现决定了它没有Java和.Net这种AppServer的概念,而http协议是一个无状态的协议,PHP只能被用户触发,被

  • 上一节:分分钟部署一个Hexo环境 准备启程 一旦安装了Hexo,运行以下命令初始化Hexo在目录 $ hexo init <folder> $ cd <folder> $ cnpm install 一旦初始化,你的项目文件夹是这个样子: . ├── _config.yml ├── package.json ├── scaffolds ├── scripts ├── source | ├──

  • 本文向大家介绍详解Java实现单例的五种方式,包括了详解Java实现单例的五种方式的使用技巧和注意事项,需要的朋友参考一下 1. 什么是单例模式 单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存。 单例模式的要求有三点: 某个类只能有一个实例 它必须自行创建这个实例 他必须自行向整个系