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

前端技术 2023/09/05 Java

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(); 
 } 
... 
}

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

本文地址:https://www.stayed.cn/item/12823

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。