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 }
原文地址:https://www.cnblogs.com/seven1314pp/p/7729108.html