zoukankan      html  css  js  c++  java
  • Spring事务配置的五种方式

    转自:http://www.blogjava.net/robbie/archive/2009/04/05/264003.html
     

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

        总结如下:

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

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

        具体如下图:

    Spring事务配置 (2)

        根据代理机制的不同,总结了五种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     
    21 }
  • 相关阅读:
    ASP.NET MVC3 系列教程 部署你的WEB应用到IIS 6.0
    ASP.NET MVC3 系列教程 控制器 & 视图
    Windows 8 如何安装到Virtual Box虚拟机上(x86)
    工具脚本(网络编码)
    c库的rand/random随机数产生函数性能差?
    shell脚本模版
    linux的IO调度算法和回写机制
    thrift安装脚本
    通用高效的c++内存池(特定类型)
    [转] NoSQL生态系统
  • 原文地址:https://www.cnblogs.com/seven1314pp/p/7729108.html
Copyright © 2011-2022 走看看