程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Spring事務Transaction配置的五種注入方式

詳解Spring事務Transaction配置的五種注入方式

編輯:關於JAVA

前段時間對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>

第三種方式:使用攔截器

<?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="transactionInterceptor" 
 class="org.springframework.transaction.interceptor.TransactionInterceptor">   
 <property name="transactionManager" ref="transactionManager"  />   
 <!-- 配置事務屬性 -->   
 <property name="transactionAttributes">   
 <props>   
 <prop key="*">PROPAGATION_REQUIRED </prop>   
 </props>   
 </property>   
 </bean>   
       
 <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
 <property name="beanNames">   
 <list>   
 <value> *Dao </value>   
 </list>   
 </property>   
 <property name="interceptorNames">   
 <list>   
 <value> transactionInterceptor </value>   
 </list>   
 </property>   
 </bean>   
       
 <!-- 配置DAO -->   
 <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">  
 <property name="sessionFactory" ref="sessionFactory"  />   
 </bean>   
 </beans>

第四種方式:使用tx標簽配置的攔截器

<?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"
 xmlns:tx="http://www.springframework.org/schema/tx"
 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  
 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">   
      
 <context:annotation-config  />   
 <context:component-scan base-package="com.bluesky"  />   
      
 <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>   
      
 <tx:advice id="txAdvice" transaction-manager="transactionManager">  
 <tx:attributes>   
 <tx:method name="*" propagation="REQUIRED"  />   
 </tx:attributes>   
 </tx:advice>   
       
 <aop:config>   
 <aop:pointcut id="interceptorPointCuts"
 expression="execution(*com.bluesky.spring.dao.*.*(..))"  />   
 <aop:advisor advice-ref="txAdvice"
 pointcut-ref="interceptorPointCuts"  />   
 </aop:config>   
 </beans>

第五種方式:全注解

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved