權限、事務、日志處理如果混雜在業務代碼之中會使整個代碼變得非常復雜而且可讀性很差,難以修改重構。

          面向對象的分析和設計引入了繼承、抽象和多態等概念,由此為我們提供了降低軟件復雜性的工具。但是,開發人員在軟件設計過程中仍然經常會面對無法用面向對象軟件開發技術輕易解決的問題。這些問題之一就是如何處理應用程序中的橫切關注點(Cross-cutting concerns)。

          1、橫切關注點

          關注點就是設計人員感興趣的某一概念或區域。例如,在一個訂貨系統中,核心關注點可能是訂單處理和生產,而系統關注點可能是事務處理和安全管理。

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

          橫切關注點的表現有:

          ·代碼糾結當一個模塊或代碼段同時管理多個關注點時發生這種情況。

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

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

          2、關注點的隔離

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

          聲明式的AOP事務配置如下:

          <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時注冊的實際類不是自己開發的NodeManagerImpl類而是注冊的RightTransactionProxyFactoryBean代理工廠類。在其它類里調用的nodeManager方法實際上是先調用的此代理工廠類的加入橫切點代碼(事務處理代碼)然后在調用的NodeManagerImpl的相應方法,這樣就實現了NodeManagerImpl類里不用操心事務問題,而實際的事務由加入在切點的Advice來完成。其在真正方法執行前啟動事務,執行后提交事務(commit),如果出現異常則回滾(rollback)。

                 代理工廠類是采用jdk4以上自帶的動態代理機制實現的。

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

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

          TransactionAOP.bmp

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

          Copyright © publisher luo

          主站蜘蛛池模板: 治县。| 鹤山市| 伊吾县| 孟州市| 岳阳县| 囊谦县| 阳信县| 和顺县| 舒城县| 通化县| 武冈市| 仁化县| 安丘市| 柳林县| 蒙自县| 平江县| 海盐县| 古交市| 万州区| 丹江口市| 东海县| 黔西| 湘阴县| 互助| 定远县| 会理县| 上饶市| 丹寨县| 太仆寺旗| 建始县| 大姚县| 嘉义县| 慈溪市| 全南县| 洞口县| 泰安市| 聂荣县| 炎陵县| 绩溪县| 肇州县| 嘉定区|