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)檢查等服務,對象的程序代碼中若被硬生生的寫入相關的Logging、Security程序片段,則可使用以下圖解表示出Cross-cutting與Cross-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這個Advice的Target。
- <!--[if !supportLists]--><!--[endif]-->Introduction
對于一個現存的類別,Introduction可以為其增加行為,而不用修改該類別的程序,具體的說,您可以為某個已撰寫、編譯完成的類別,在執行時期動態加入一些方法或行為,而不用修改或新增任何一行程序代碼。
- <!--[if !supportLists]--><!--[endif]-->Proxy
在《Expert One-on-One J2EE Development WIthout EJB》一書中,Rod Johnson、Juergen Hoeller在第八章中有提到,AOP的實作有五個主要的策略:Dynamic Proxies、Dynamic Byte Code Generation、Java Code Generation、Use of a Custon Class Loader、Language Extensions。
在之前靜態代理與動態代理中,已經使用實際的程序范例介紹過代理機制的實現,Spring的AOP主要是透過動態代理來完成。
- <!--[if !supportLists]-->Weave
Advice被應用至對象之上的過程稱之為縫合(Weave),在AOP中縫合的方式有幾個時間點:編譯時期(Compile time)、類別加載時期(Classload time)、執行時期(Runtime)。
結合DynamicProxyDemo的實例,將以上介紹過的AOP相關名詞具體的使用圖片來加以表示,有助于您對每一個名詞的理解與認識: