閑人野居
          好好學(xué)習(xí),天天向上
          posts - 57,  comments - 137,  trackbacks - 0

          在 1.x中,spring 的事務(wù)聲明,一直是采用動(dòng)態(tài)代理bean 實(shí)現(xiàn)的,也就是采用ProxyFactoryBean或者子類TransactionProxyFactoryBean來實(shí)現(xiàn)的

          考慮下面的例子:(用1.x實(shí)現(xiàn))
          <bean id="myTxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          ??? <property name="sessionFactory" ref="mySessionFactory"/>
          ? </bean>

          ? <bean id="myProductService" class="org.springframework.aop.framework.ProxyFactoryBean">
          ??? <property name="proxyInterfaces" value="product.ProductService"/>
          ??? <property name="target">
          ??????? <bean class="product.DefaultProductService">
          ??????????? <property name="productDao" ref="myProductDao"/>
          ??????? </bean>
          ??? </property>
          ??? <property name="interceptorNames">
          ????? <list>
          ??????? <value>myTxInterceptor</value> <!-- the transaction interceptor (configured elsewhere) -->
          ????? </list>
          ??? </property>
          ? </bean>

          ?<bean id="myTxInterceptor"

          class="org.springframework.transaction.interceptor.TransactionInterceptor">

          <property name="transactionManager">

          ?? <ref bean="myTransactionManager"/>

          </property>

          <property name="transactionAttributeSource">

          ? <value>

          ?? product.ProductService.increasePrice*=PROPAGATION_REQUIRED

          ? product.ProductService.someOtherBusinessMethod=PROPAGATION_MANDATORY

          ? </value>

          </property>

          </bean>

          或者

          <bean id="myProductService"

          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

          <property name="transactionManager">

          <ref bean="myTransactionManager"/>

          </property>

          <property name="target">

          <ref bean="myProductServiceTarget"/>

          </property>

          <property name="transactionAttributes">

          <props>

          <prop key="increasePrice*">PROPAGATION_REQUIRED</prop>

          <prop key="someOtherBusinessMethod">PROPAGATION_MANDATORY</prop>

          </props>

          </property>
          </bean>

          當(dāng)然,這需要每個(gè)服務(wù)接口都要聲明一個(gè)事務(wù)bean ,這比較麻煩,當(dāng)然,spring 也提供了另外一種解決方案

          采用BeanNameAutoProxyCreator 自動(dòng)代理聲明入口來全局聲明所有的事務(wù)。
          <bean id="matchAllWithPropReq"
          ?????????class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource">
          ?????????<property name="transactionAttribute"><value>PROPAGATION_REQUIRED</value></property>
          </bean>

          <bean id="matchAllTxInterceptor"
          ?????????class="org.springframework.transaction.interceptor.TransactionInterceptor">
          ?????????<property name="transactionManager"><ref bean="transactionManager"/></property>
          ?????????<property name="transactionAttributeSource"><ref bean="matchAllWithPropReq"/></property>
          </bean>
          <bean id="autoProxyCreator"
          ?????????class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
          ?????????<property name="interceptorNames">
          ????????????<list>
          ???????????????<idref local="matchAllTxInterceptor"/>
          ???????????????<idref bean="hibInterceptor"/>
          ????????????</list>
          ?????????</property>
          ?????????<property name="beanNames">
          ????????????<list>
          ???????????????<idref local="core-services-applicationControllerSevice"/>
          ???????????????<idref local="core-services-deviceService"/>
          ???????????????<idref local="core-services-authenticationService"/>
          ???????????????<idref local="core-services-packagingMessageHandler"/>
          ???????????????<idref local="core-services-sendEmail"/>
          ???????????????<idref local="core-services-userService"/>

          ????????????</list>
          ?????????</property>
          </bean>
          list中包含了所有需要實(shí)現(xiàn)事務(wù)的服務(wù)bean?

          ?spring 2.0帶來的aop變化和bean xml schema的變化,使得事務(wù)的處理變得更加的簡(jiǎn)單,
          同aop一樣,事務(wù)也采用兩種方式來處理,一種主要為xml 聲明,另外的一種也就是注釋的引入。
          先來看第一種情況:
          <beans xmlns="http://www.springframework.org/schema/beans"
          ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          ?????? 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.xsd
          ?????? http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
          ?????? http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
          ">

          ? <!-- SessionFactory, DataSource, etc. omitted -->

          ? <bean id="myTxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          ??? <property name="sessionFactory" ref="mySessionFactory"/>
          ? </bean>
          ?
          ? <aop:config>
          ?? <!-- 這定義了主要的切面,也就是那些接口可以使用事務(wù),這里只是說執(zhí)行ProductService的所有方法-->
          ??? <aop:pointcut id="productServiceMethods" expression="execution(* product.ProductService.*(..))"/>
          ??? <aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods"/>
          ? </aop:config>
          ??<!--主要的事務(wù) advice 聲明事務(wù)的相關(guān)屬性-->
          ? <tx:advice id="txAdvice" transaction-manager="myTxManager">
          ??? <tx:attributes>
          ????? <tx:method name="increasePrice*" propagation="REQUIRED"/>
          ????? <tx:method name="someOtherBusinessMethod" propagation="REQUIRES_NEW"/>
          ????? <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
          ??? </tx:attributes>
          ? </tx:advice>

          ? <bean id="myProductService" class="product.SimpleProductService">
          ??? <property name="productDao" ref="myProductDao"/>
          ? </bean>

          </beans>

          第二種方式,使用 @Transactional 注釋

          @Transactional

          public interface FooService {

          ?

          ??? Foo getFoo(String fooName);

          ?

          ??? Foo getFoo(String fooName, String barName);

          ?

          ??? void insertFoo(Foo foo);

          ?

          ??? void updateFoo(Foo foo);

          }


          xml 配置

          <!-- from the file 'context.xml' -->

          <?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: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.xsd

          ?????? http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

          ?????? http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

          ?

          ? <!-- this is the service object that we want to make transactional -->

          ? <bean id="fooService" class="x.y.service.DefaultFooService"/>

          ?

          ? <!-- enable the configuration of transactional behavior based on annotations -->

          ? <tx:annotation-driven/>

          ?

          ? <!-- a PlatformTransactionManager is still required -->

          ? <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

          ??? <!-- sourced from somewhere else -->

          ??? <property name="dataSource" ref="dataSource"/>

          ? </bean>

          ?

          ? <!-- other <bean/> definitions here -->

          ?

          </beans>

          public class DefaultFooService implements FooService {

          ?

          ??? public Foo getFoo(String fooName) {

          ??????? // do something

          ??? }

          ?

          ??? // these settings have precedence

          ??? @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)

          ??? public void updateFoo(Foo foo) {

          ??????? // do something

          ??? }

          }

          posted on 2006-09-18 20:13 布衣郎 閱讀(2652) 評(píng)論(0)  編輯  收藏 所屬分類: spring

          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(12)

          隨筆分類(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 357332
          • 排名 - 155

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 琼中| 新巴尔虎右旗| 启东市| 杭锦旗| 河池市| 牙克石市| 四平市| 台北县| 汾西县| 屏边| 宾阳县| 乳山市| 满洲里市| 阜康市| 嘉鱼县| 藁城市| 汝城县| 汽车| 广德县| 琼结县| 黄山市| 安宁市| 北宁市| 全椒县| 楚雄市| 富川| 缙云县| 柳江县| 富源县| 平利县| 长子县| 车致| 新乐市| 南木林县| 中宁县| 新津县| 萍乡市| 康保县| 五华县| 诏安县| 东乌珠穆沁旗|