Spring中AOP的核心概念
Spring是J2EE開發中非常流行的框架,他最重要的兩大基本功能是提供IoC容器和AOP概念的實現。這裡介紹一下AOP,它的全名為Aspect-Oriented Programming,可翻譯為面向層面程式設計。下面介紹一些AOP的基本術語和概念。
1.Cross-cutting concern:我們編寫的程式主要是為了實現業務邏輯,因此主要的程式碼是業務流程程式碼,但是出於需要會加入日誌、安全檢查、資料庫事務等系統層面的程式碼。這些動作在AOP中被稱為Cross-cutting concerns。這類程式碼被硬生生地橫切(Cross-cutting)入業務程式碼中,使得程式邏輯更為複雜,增加了軟體的維護成本。
2.Aspect:將散落於各個業務邏輯中的Cross-cutting concerns收集起來,設計成各個獨立可重用的物件,這些物件稱為Aspect。例如將寫日誌動作設計為一個LogHandler類,LogHandler實現InvocationHandler介面,在invoke方法中呼叫業務方法之前或之後加入日誌程式碼。這是一種代理模式,InvocationHandler介面是JDK的動態代理API中的一個介面。這個LogHandler類就是一個Aspect。事實上,在Spring中,開發者並不會需要設計一個這樣的類,而是由Spring通過配置檔案自動生成,因此它更多地存在於概念中。對應的註解為@Aspect 。
3.Advice:Aspect中對於Cross-cutting concerns的具體實現稱之為Advice。比如LogHandler類的invoke方法,就是一個Advice。Advice中包括了日誌程式程式碼是如何實現的。
invoke方法的程式碼大致如:
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
logger.log("start: "+method);
result = method.invoke(delegate, args);
logger.log("end: "+method);
} catch (Expcetion e) {
logger.log(e.toString());
}
這三者的關係可概括為:從若干Cross-cutting concerns中辨識出Aspects,具體設計為Advices。在Spring中Advice一般會設計成單獨的實現類。一般使用註解@After、@Beforre、@Around 來定義Advice 。
4.Joinpoint:Advice在應用程式執行時加入業務流程的點或時機稱之為Joinpoint,具體地說,就是Advice在應用程式中被執行的時機。Spring只支援方法的Joinpoint,可以在方法被執行之前或之後,或發生某個異常時執行。
5.Pointcut:Pointcut定義了感興趣的Jointpoint(也可以反過來說,符合Pointcut條件的每一個被攔截處即為連線點--Joinpoint),當呼叫的方法符合Pointcut表示式時,將Advice織入到程式中。在Spring中,通過配置檔案或Annotation方式編寫的Pointcut,當呼叫的方法符合配置檔案中定義的Pointcut表示式時,將相應的Advice應用於程式。@After、@Beforre、@Around的引數的攔截規則就是Pointcut 。為了使Pointcut複用,可以使用@Pointcut專門定義攔截規則。
6.Target:一個Advice被應用於的物件。
7.Introductiuon:對於一個現存的類,Introduction可以為其增加行為,而不用修改該類的程式。
8.Weave:Advice被應用至物件之上的過程稱之為織入(Weave)。