zoukankan      html  css  js  c++  java
  • Spring事务Transaction配置的五种注入方式详解

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

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

        总结如下:

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

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

        具体如下图:

    NewImage

        根据代理机制的不同,总结了五种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 }
  • 相关阅读:
    一道经典的JavaScript面试题
    模拟学信网登录,Cookie 序列化,在反序列化之后不能用的问题
    EF搜索数据自动将表名变复数问题
    EF查看sql的方法
    查看当前正在被执行的sql
    mmsql查看最近操作日志
    查询存储过程里面的含有的关键字
    mmsql 查询每个分类的前3条数据
    C# checked关键字当属性
    windows2012 IIS8.5 不能在此路径中使用此配置节
  • 原文地址:https://www.cnblogs.com/icenter/p/5277852.html
Copyright © 2011-2022 走看看