只是小人物

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

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

具体如下图:

根据代理机制的不同,总结了五种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 }


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

posted on 2012-08-03 09:08  只是小人物  阅读(120)  评论(0编辑  收藏  举报