AOP觀念與術語

示例下載。

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相關名詞具體的使用圖片來加以表示,有助於您對每一個名詞的理解與認識:


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章