<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    權(quán)限、事務(wù)、日志處理如果混雜在業(yè)務(wù)代碼之中會使整個代碼變得非常復(fù)雜而且可讀性很差,難以修改重構(gòu)。

    面向?qū)ο蟮姆治龊驮O(shè)計引入了繼承、抽象和多態(tài)等概念,由此為我們提供了降低軟件復(fù)雜性的工具。但是,開發(fā)人員在軟件設(shè)計過程中仍然經(jīng)常會面對無法用面向?qū)ο筌浖_發(fā)技術(shù)輕易解決的問題。這些問題之一就是如何處理應(yīng)用程序中的橫切關(guān)注點(Cross-cutting concerns)。

    1、橫切關(guān)注點

    關(guān)注點就是設(shè)計人員感興趣的某一概念或區(qū)域。例如,在一個訂貨系統(tǒng)中,核心關(guān)注點可能是訂單處理和生產(chǎn),而系統(tǒng)關(guān)注點可能是事務(wù)處理和安全管理。

    橫切關(guān)注點是影響多個類或模塊的關(guān)注點,即未能很好地局部化和模塊化的關(guān)注點。

    橫切關(guān)注點的表現(xiàn)有:

    ·代碼糾結(jié)當一個模塊或代碼段同時管理多個關(guān)注點時發(fā)生這種情況。

    ·代碼分散當一個關(guān)注點分布在許多模塊中并且未能很好地局部化和模塊化時發(fā)生這種情況。

    這些現(xiàn)象會從幾個方面影響軟件;例如,它們會導(dǎo)致軟件難以維護和重用,并且難以編寫和理解。

    2、關(guān)注點的隔離

    面向方面編程試圖通過引入關(guān)注點的隔離這一概念來解決這些問題。采用這一概念,可以以一種模塊化而且適當局部化的方式實現(xiàn)關(guān)注點。AOP解決這個問題的辦法是在設(shè)計空間中增加額外一維,并且引入了一些構(gòu)造,這些構(gòu)造使我們能夠定義橫切關(guān)注點,將它們轉(zhuǎn)移進新的維,并且以模塊化方式將它們打 包。

    聲明式的AOP事務(wù)配置如下:

    <bean id="nodeTarget"

                  class="com.daosheng.service.impl.NodeManagerImpl" singleton="true"

                  lazy-init="default" autowire="default" dependency-check="default">

                  <property name="dao">

                         <ref local="nodeDAO" />

                  </property>         

           </bean>

           <bean id="nodeManager"

                  class="com.daosheng.cms.right.RightTransactionProxyFactoryBean"

                  singleton="true" lazy-init="default" autowire="default"

                  dependency-check="default">

                  <property name="transactionManager">

                         <ref local="transactionManager" />

                  </property>

                  <property name="target">

                         <ref local="nodeTarget" />

                  </property>

                  <property name="transactionAttributes">

                         <props>                     

                                <prop key="insert*">

                                       PROPAGATION_REQUIRED,-ApplicationException

                                </prop>

                                <prop key="update*">

                                       PROPAGATION_REQUIRED,-ApplicationException

                                </prop>

                         </props>

                  </property>

           </bean>

     

    其實在注冊nodeManager時注冊的實際類不是自己開發(fā)的NodeManagerImpl類而是注冊的RightTransactionProxyFactoryBean代理工廠類。在其它類里調(diào)用的nodeManager方法實際上是先調(diào)用的此代理工廠類的加入橫切點代碼(事務(wù)處理代碼)然后在調(diào)用的NodeManagerImpl的相應(yīng)方法,這樣就實現(xiàn)了NodeManagerImpl類里不用操心事務(wù)問題,而實際的事務(wù)由加入在切點的Advice來完成。其在真正方法執(zhí)行前啟動事務(wù),執(zhí)行后提交事務(wù)(commit),如果出現(xiàn)異常則回滾(rollback)。

           代理工廠類是采用jdk4以上自帶的動態(tài)代理機制實現(xiàn)的。

    框架的AOP中提供了4種處理切入類型:around,before,after,introduction.顧名思義,  
    1) around
    是針對具體的某個切入點的方法(比如,現(xiàn)在有個OrderBook方法,around的切入類型是就這個方法的內(nèi)部調(diào)用,是通過java的元 數(shù)據(jù),在運行時通過Method.invoke來調(diào)用,具有返回值,當發(fā)生意外的時候會終止.記住的一點是,返回值.);  
    2)before
    是在方法調(diào)用前調(diào)用(OrderBook方法前調(diào)用,但是沒有返回值,同時在通常意外情況下,會繼續(xù)運行下一步方法.記住的一點是沒有返回值);  
    3)after
    before剛好相反,沒有什么特別的地方.  
    4)introduction
    是一個更加特殊的,但功能更加強大的切入類型.比如(你現(xiàn)在有Book對象,Computer對象,還有幾十個這種業(yè)務(wù)對象,現(xiàn)在你希望在每個這樣的對象中都加入一個記錄最后修改的時間.但是你又不希望對每個類都進行修改,因為太麻煩了,同時更重要的一點,破壞了對象的完整性,說不定你以后又不需要這個時間數(shù)據(jù)了呢.框架AOP為了專門實現(xiàn)這種思想提供了一個切入處理,那就是introduction.introduction可以為動態(tài)加入某些方法,這樣可以在運行時,強制轉(zhuǎn)換這些對象,進行插入時間數(shù)據(jù)的動作,更深的內(nèi)幕就是C++虛函數(shù)中的vtable思想).

    下面時序圖為事務(wù)在整個各層代碼協(xié)作過程中啟動和提交的過程。每個Manager或者DAO實體可能是開發(fā)的實際類也可以是代理類。

    TransactionAOP.bmp

    posts - 9, comments - 27, trackbacks - 0, articles - 19

    Copyright © publisher luo

    主站蜘蛛池模板: 亚洲国产精品久久| 亚洲愉拍99热成人精品热久久| 亚洲国产高清在线| 久久久久国色av免费看 | 最近2019中文字幕免费看最新 | 免费乱码中文字幕网站| 国产AV无码专区亚洲AV麻豆丫| 成人特黄a级毛片免费视频| 亚洲国产乱码最新视频| 日本一道本高清免费| 色噜噜狠狠色综合免费视频| 免费va在线观看| 水蜜桃视频在线观看免费播放高清| 亚洲码国产精品高潮在线| 久久久久久毛片免费播放| 亚洲另类视频在线观看| 日本免费一区尤物| 日本高清不卡中文字幕免费| 亚洲精品成人片在线播放| 久久99国产乱子伦精品免费| 亚洲AV无码一区二区三区人| 日产乱码一卡二卡三免费| 香蕉免费一级视频在线观看| 亚洲人成网址在线观看| 国产三级在线观看免费| 思思久久99热免费精品6| 亚洲AV中文无码乱人伦下载| 波多野结衣在线免费观看| 99亚洲男女激情在线观看| 亚洲综合国产一区二区三区| 亚洲免费网站在线观看| 精品久久亚洲一级α| 亚洲av无码乱码国产精品fc2| 全免费毛片在线播放| 无遮挡免费一区二区三区 | 国产女高清在线看免费观看| 国产真人无码作爱免费视频| 亚洲人成片在线观看| 精品国产亚洲一区二区在线观看| 91九色视频无限观看免费| 国产精品亚洲精品爽爽|