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

前段时间对spring的事务配置做了比较深入的研究,在此之间对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>  

 

第三种方式:使用拦截器

 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> 

第五种方式:全注解

posted on 2017-05-05 14:14  小毛线  阅读(550)  评论(0)    收藏  举报

导航