丄諦啲仇魜ヤ
          如 果 敵 人 讓 你 生 氣 , 那 說 明 你 沒 有 勝 他 的 把 握!
          posts - 6,comments - 56,trackbacks - 1

          AOP全名為Aspect-Oriented Programming,有關于AOP的許多名詞術語都過于抽象,單從字面上并不容易理解其名詞意義,這邊將以之前介紹代理機制的范例來逐一對照以介紹AOP的術語與觀念:

          • <!--[if !supportLists]-->Cross-cutting concern

          DynamicProxyDemo項目的例子中,記錄的動作原先被橫切(Cross-cutting)入至HelloSpeaker本身所負責的業務流程之中,另外類似于記錄這類的動作,如安全(Security)檢查、事務(Transaction)等系統層面的服務(Service),在一些應用程序之中常被見到安插至各個對象的處理流程之中,這些動作在AOP的術語中被稱之為Cross-cutting concerns
           

          以圖片說明可強調出Cross-cutting concerns的意涵,例如原來的業務流程是很單純的:



          現在為了要加入記錄(Logging)與安全(Security)檢查等服務,對象的程序代碼中若被硬生生的寫入相關的LoggingSecurity程序片段,則可使用以下圖解表示出Cross-cuttingCross-cutting concerns的概念:



          Cross-cutting concerns若直接撰寫在負責某業務的對象之流程中,會使得維護程序的成本增高,例如若您今天要將對象中的記錄功能修改或是移除該服務,則必須修改所有撰寫曾記錄服務的程序代碼,然后重新編譯,另一方面,Cross-cutting concerns混雜于業務邏輯之中,使得業務對象本身的邏輯或程序的撰寫更為復雜。

          •   <!--[endif]-->Aspect

          將散落于各個業務對象之中的Cross-cutting concerns收集起來,設計各個獨立可重用的對象,這些對象稱之為Aspect,例如在DynamicProxyDemo項目中將登錄的動作設計為一個LogHandler類別,LogHandler類別在AOP的術語就是Aspect的一個具體實例,在AOP中著重于Aspect的辨認,將之從業務流程中獨立出來,在需要該服務的時候,縫合(Weave至應用程序之上,不需要服務的時候,也可以馬上從應用程序中脫離,應用程序中的可重用組件不用作任何的修改,例如在DynamicProxyDemo項目中的HelloSpeaker所代表的角色就是應用程序中可重用的組件,在它需要記錄服務時并不用修改本身的程序代碼。

          另一方面,對于應用程序中可重用的組件來說,以AOP的設計方式,它不用知道處理提供服務的對象之存在,具體的說,與服務相關的API不會出現在可重用的應用程序組件之中,因而可提高這些組件的重用性,您可以將這些組件應用至其它的應用程序之中,而不會因為目前加入了某些服務而與目前的應用程序框架發生耦合。

          • <!--[if !supportLists]-->Advice

          Aspect的具體實作稱之為Advice,以記錄的動作而言,Advice中會包括真正的記錄程序代碼是如何實作的,像是DynamicProxyDemo項目中的LogHandler類別就是Advice的一個具體實例,Advice中包括了Cross-cutting concerns的行為或所要提供的服務。 

          • <!--[if !supportLists]-->Joinpoint

          Aspect在應用程序執行時加入業務流程的點或時機稱之為Joinpoint,具體來說,就是Advice在應用程序中被呼叫執行的時機,這個時機可能是某個方法被呼叫之前或之后(或兩者都有),或是某個例外發生的時候。

          • <!--[if !supportLists]--><!--[endif]-->Pointcut

          Pointcut是一個定義,藉由這個定義您可以指定某個Aspect在哪些Joinpoint時被應用至應用程序之上。具體的說,您可以在某個定義檔中撰寫Pointcut,當中說明了哪些Aspect要應用至應用程序中的哪些Joinpoint 

          • <!--[if !supportLists]-->Target

          一個Advice被應用的對象或目標對象,例如DynamicProxyDemo項目中的HelloSpeaker就是LogHandler這個AdviceTarget

          • <!--[if !supportLists]--><!--[endif]-->Introduction

          對于一個現存的類別,Introduction可以為其增加行為,而不用修改該類別的程序,具體的說,您可以為某個已撰寫、編譯完成的類別,在執行時期動態加入一些方法或行為,而不用修改或新增任何一行程序代碼。

          • <!--[if !supportLists]--><!--[endif]-->Proxy

          Expert One-on-One J2EE Development WIthout EJB一書中,Rod JohnsonJuergen Hoeller在第八章中有提到,AOP的實作有五個主要的策略:Dynamic ProxiesDynamic Byte Code GenerationJava Code GenerationUse of a Custon Class LoaderLanguage Extensions

          在之前靜態代理與動態代理中,已經使用實際的程序范例介紹過代理機制的實現,SpringAOP主要是透過動態代理來完成。

          • <!--[if !supportLists]-->Weave

          Advice被應用至對象之上的過程稱之為縫合(Weave),在AOP中縫合的方式有幾個時間點:編譯時期(Compile time)、類別加載時期(Classload time)、執行時期(Runtime)。
           

          結合DynamicProxyDemo的實例,將以上介紹過的AOP相關名詞具體的使用圖片來加以表示,有助于您對每一個名詞的理解與認識:

          posted on 2007-09-13 19:33 Crying 閱讀(358) 評論(2)  編輯  收藏 所屬分類: spring

          FeedBack:
          # re: AOP觀念(轉載)
          2007-09-16 11:07 | Crying
          IOC 個人理解
          從字面意思來說是控制反轉,利用依賴注入模式將原來組件依賴于對象的關系,改變成組件依賴于抽象接口,將應用程序依賴于容器變成容器管理應用程序。為了調用IOC容器,組件必須利用BeanFactory或ApplicationContext,利用他們可以管理容器中的Bean實例的生命周期,用getBean(String ...)方法得到Bean實例,ApplicationContext在BeanFactory的基礎之上實現了擴展增加了資源取得,消息解析,事件處理等功能,使得Spring的IOC容器來協調各組件間相互的依賴關系。
          http://www.itisedu.com/phrase/200603091205485.html



            回復  更多評論
            
          # re: AOP觀念(轉載)
          2007-09-16 11:50 | Crying
          AOP對我來說到現在還沒真正的理解,昨天晚上又把《Spring開發 手冊》和《精通Spring》的AOP部分看了哈可是還是云里霧里的,要是叫我說出AOP的思想我肯定打哽心里是明白會用,可就是說不上來(丟人了....).。
          我現在就把我所能說的都說出來啊,說的不對大家別罵我,要是能對AOP有很好理解的麻煩給我留個言,給小弟帶來點感悟。。。先謝謝啦。
          我認為AOP的實現其實就是靠的就是代理Bean(PoxyFactoryBean)和攔截器(Interceptor)來實現的。
          AOP中有幾個關鍵字Aspect,advice,pointCut,target,......
          Aspect 就是將你想往目標對象中插入的東西(如事務,日志),將這些日志,事務封裝成一個類也就成了Aspect了。
          advice 是可是說是Aspect中的一個方法吧。
          pointCut 是目標對象中的一個方法,也就是你想在目標對像的哪個位置織入你 的Advice。
          target 就是你的目標對象啦

          Spring AOP  回復  更多評論
            
          主站蜘蛛池模板: 吉木乃县| 桑日县| 砀山县| 镇远县| 明溪县| 岳阳县| 高邑县| 阜宁县| 合山市| 商南县| 温宿县| 合水县| 昭觉县| 商水县| 松阳县| 南陵县| 孝义市| 彩票| 毕节市| 双鸭山市| 安吉县| 布尔津县| 莱芜市| 阿拉善右旗| 玉田县| 合川市| 中阳县| 佛山市| 民和| 张家界市| 揭西县| 鄂尔多斯市| 宁阳县| 华坪县| 宝鸡市| 城步| 蓝田县| 库尔勒市| 顺义区| 大城县| 新晃|