小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Spring中的四種聲明式事務(wù)的配置

 韻朵之家 2009-04-11
 
Spring中的四種聲明式事務(wù)的配置Spring容器中有兩種思想很重要,也就是我們常用的Ioc和Aop,如果理解了這兩種思想,對于我們學(xué)習(xí)設(shè)計模式和編程有很大的幫助,美國四人幫(GOF)寫的設(shè)計模式中,有很多都用到了Ioc的思想。簡單的說就是依賴注入的思想。常見的一種情況:如果一個類中要復(fù)用另外一個類中的功能時,我們可能會首先想到繼承,如果你知道Ioc這種思想的話,我想你不會用繼承,你會馬上想到把要用到功能抽取出來,在我們要用到的類中只需通過 set方法簡單的注入就可以了,其實這里用到了對象的組合代替繼承,這樣不僅避免了單一繼承,還很好的實現(xiàn)了松耦合。同時也遵循了面向?qū)ο蟮木幊痰脑O(shè)計原則:多用組合,少用繼承。在這里對于Ioc和Aop這兩種思想的好處。我就不介紹了。接下來我要說的是Spring中幾種常見的事務(wù)配置,是Aop和 Ioc的充分體現(xiàn)。

    在說點題外話,以前EJB在J2EE中開發(fā)中可是大名鼎鼎的了。就是因為EJB提供了很多服務(wù),而不需要我們?nèi)ラ_發(fā)了,其中用到最多的算是它提供的聲明式事務(wù)了。在Spring沒有出現(xiàn)之前,EJB在J2EE開發(fā)中扮演著非常重要的角色。同時也是很多項目失敗的罪魁禍?zhǔn)?。其中的原因就是因為它是重量級,強侵入性收費的框架。需要昂貴的服務(wù)器支持,在加上它的測試更是讓人頭痛。而Spring恰恰與它相反。Spring是一個輕量級的,非侵入性的開源框架。它提供的聲明式事務(wù)的功能更是強大,不需要容器的支持。這一點吸引力很多人愿意放棄EJB而使用Spring.讓我們言歸正傳吧。

    以下兩個bean的配置是下面要用到的。

    <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->
     <bean id="transactionManager"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
      <property name="sessionFactory">
       <ref local="sessionFactory" />
      </property>
     </bean>
    <!-- *******業(yè)務(wù)邏輯層(是對各個DAO層的正面封裝)主要用到<<門面模式>>****** -->
     <bean id="fundService"
      class="com.jack.fund.service.serviceimpl.FundService">
      <property name="operdao">
       <ref bean="operatorDAO" />
      </property>
      <property name="producedao">
       <ref bean="fundProduceDAO" />
      </property>
      <property name="customerdao">
       <ref bean="customerDAO" />
      </property>
      <property name="accountdao">
       <ref bean="accountDAO" />
      </property>
      <property name="fundaccountdao">
       <ref bean="fundAccountDAO" />
      </property>
      <property name="fundtransdao">
       <ref bean="fundTransDAO" />
      </property>
     </bean>
    可能還有其他很多模塊。<bean id="fundService"/>可能只是其中的模塊。

    第一種:配置聲明式事務(wù)的方法如下。也是我們最常用的方法了,它適用于你的庫表比較少的情況下。
    <bean id="fundServiceDAOProxy"
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
      <!-- 配置事務(wù)管理器 -->
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
      <!-- 此屬性指定目標(biāo)類本省是否是代理的對象,如果目標(biāo)類沒有實現(xiàn)任何類,就設(shè)為true代表自己 -->
      <property name="proxyTargetClass">
       <value>false</value>
      </property>
      <property name="proxyInterfaces">
       <value>com.jack.fund.service.IFundService</value>
      </property>
      <!-- 目標(biāo)bean -->
      <property name="target">
       <ref bean="fundService" />
      </property>
      <!-- 配置事務(wù)屬性 -->
      <property name="transactionAttributes">
       <props>
        <prop key="delete*">PROPAGATION_REQUIRED</prop>
        <prop key="add*">PROPAGATION_REQUIRED</prop>
        <prop key="update*">PROPAGATION_REQUIRED</prop>
        <prop key="save*">PROPAGATION_REQUIRED</prop>
        <prop   key="find*">PROPAGATION_REQUIRED,readOnly</prop>
       </props>
      </property>
     </bean>
     以下可能還有其他的xxxServiceDAOProxy.大家可以看出針對每一個功能模塊配置一個業(yè)務(wù)代理服務(wù)。如果模塊多大話,就顯得代碼有點多了,發(fā)現(xiàn)他們只是稍微一點不一樣。這時我們就應(yīng)該想到繼承的思想。用第二種方法。

     第二種:配置聲明式事務(wù)的方法如下。這種情況適合相對比較多的模塊時使用。
    <!-- 利用繼承的思想簡化配置,要把abstract="true" -->
     <bean id="transactionBase"
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
      lazy-init="true" abstract="true">
      <!-- 配置事務(wù)管理器 -->
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
      <!-- 配置事務(wù)屬性 -->
      <property name="transactionAttributes">
       <props>
        <prop key="delete*">PROPAGATION_REQUIRED</prop>
        <prop key="add*">PROPAGATION_REQUIRED</prop>
        <prop key="update*">PROPAGATION_REQUIRED</prop>
        <prop key="save*">PROPAGATION_REQUIRED</prop>
        <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
       </props>
      </property>
     </bean>
    而具體的模塊可以簡單的這樣配置。只要指明它的parent(父類)就可以了。父類一般把abstract="true",因為在容器加載的時候不需要初始化,等到用的時候再有它的子類調(diào)用的時候,再去初始化。
    <bean id="fundServiceDAOProxy" parent="transactionBase" >
      <property name="target">
      <ref bean="fundService" />
      </property>
     </bean>
    這樣配置的話,如果有多個像fundService這樣模塊時,可以少些很多重復(fù)的代碼。

第三種:配置聲明式事務(wù)的方法如下。主要利用BeanNameAutoProxyCreator自動創(chuàng)建事務(wù)代理
      <bean id="transactionInterceptor"
      class="org.springframework.transaction.interceptor.TransactionInterceptor">
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
      <!-- 配置事務(wù)屬性 -->
      <property name="transactionAttributes">
       <props>
        <prop key="delete*">PROPAGATION_REQUIRED</prop>
        <prop key="add*">PROPAGATION_REQUIRED</prop>
        <prop key="update*">PROPAGATION_REQUIRED</prop>
        <prop key="save*">PROPAGATION_REQUIRED</prop>
        <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
       </props>
      </property>
     </bean>
     <bean
      class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
      <property name="beanNames">
       <list>
        <value>fundService</value>
       </list>
      </property>
      <property name="interceptorNames">
       <list>
        <value>transactionInterceptor</value>
       </list>
      </property>
     </bean>
    這種方法主要利用了攔截器的原理。

    前三種方法一般都必需指定具體的模塊bean.如果模塊過多話,比如一個大型的網(wǎng)站一般有幾十個模塊。我們就得考慮用第四種的配置方式了。自動創(chuàng)建事務(wù)代理的方式了。

    第四種:配置聲明式事務(wù)的方法如下。
    <bean id="transactionInterceptor"
      class="org.springframework.transaction.interceptor.TransactionInterceptor">
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
    <!-- 自動代理 -->
     <bean id="autoproxy"
      class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
      <!-- 可以是Service或DAO層(最好是針對業(yè)務(wù)層*Service) -->
      <property name="beanNames">
       <list>
        <value>*Service</value>
       </list>
      </property>
      <property name="interceptorNames">
       <list>
           <value>transactionInterceptor</value>
       </list>
      </property>
     </bean>
     自動代理還有一種用法就是結(jié)合正規(guī)表達式和advice使用。
    <bean id="transactionInterceptor"
      class="org.springframework.transaction.interceptor.TransactionInterceptor">
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
     <bean id="autoProxyCreator"
      class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
    <bean id="regexpMethodPointcutAdvisor"
      class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
      <property name="advice">
      <ref bean="transactionInterceptor" />
      </property>
      <property name="pattern">
      <value>.*</value>
      </property>
      </bean>
      這個方法可以針對具體的模塊進行攔截并進行事務(wù)處理。在你的實際項目中,你可以根據(jù)你的情況選用不同的方法。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多