前段時間對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" />
name="configurationclass"
value="org.hibernate.cfg.annotationconfiguration" />
</bean>
<!-- 定義事務管理器(聲明式的事務)
-->
id="transactionmanager"
class="org.springframework.orm.hibernate3.hibernatetransactionmanager">
name="sessionfactory"
ref="sessionfactory" />
</bean>
<!-- 配置dao
-->
id="userdaotarget"
class="com.bluesky.spring.dao.userdaoimpl">
id="userdao"
class="org.springframework.transaction.interceptor.transactionproxyfactorybean">
<!--
配置事務管理器 -->
<property
name="transactionmanager"
ref="transactionmanager" />
name="target"
ref="userdaotarget" />
<property
name="proxyinterfaces"
value="com.bluesky.spring.dao.generatordao" />
<!-- 配置事務屬性
name="transactionattributes">
<props>
<prop
key="*">propagation_required</prop>
</props>
</property>
</beans>
第二種方式:所有bean共享一個代理基類
id="transactionbase"
class="org.springframework.transaction.interceptor.transactionproxyfactorybean"
lazy-init="true"
abstract="true">
<!-- 配置事務管理器
ref="transactionmanager" />
key="*">propagation_required</prop>
</bean>
id="userdao"
parent="transactionbase" >
ref="userdaotarget" />
第三種方式:使用攔截器
id="transactioninterceptor"
class="org.springframework.transaction.interceptor.transactioninterceptor">
class="org.springframework.aop.framework.autoproxy.beannameautoproxycreator">
name="beannames">
<list>
<value>*dao</value>
</list>
name="interceptornames">
<value>transactioninterceptor</value>
第四種方式:使用tx标簽配置的攔截器(常用)
xmlns:tx="http://www.springframework.org/schema/tx"
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" />
<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.xy.baseserviceimpl.*(..))" />
<aop:advisor
advice-ref="txadvice"
pointcut-ref="interceptorpointcuts" />
</aop:config>
第五種方式:全注解
<tx:annotation-driven
transaction-manager="transactionmanager"/>
此時在dao上需加上@transactional注解,如下:
package com.bluesky.spring.dao;
import java.util.list;
import org.hibernate.sessionfactory;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.orm.hibernate3.support.hibernatedaosupport;
import org.springframework.stereotype.component;
import com.bluesky.spring.domain.user;
@transactional
@component("userdao")
public class
userdaoimpl extends
hibernatedaosupport
implements userdao {
public list<user>
listusers() {
return this.getsession().createquery("from
user").list();
}
}
原帖位址:http://www.blogjava.net/robbie/archive/2009/04/05/264003.html