1. 程式人生 > >Spring AOP 概念與術語

Spring AOP 概念與術語

1.概念

AspectOriented Programming,面向切面程式設計。

利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。

AOP主要用於日誌記錄,效能統計,安全控制(許可權控制),事務處理,異常處理等。將日誌記錄,效能統計,安全控制,事務處理,異常處理等程式碼從業務邏輯程式碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的程式碼。 如:AOP做許可權控制的時候。首先攔截所有業務Bean時面的所有方法,判斷使用者是否有許可權,有許可權才能執行這些方法。而判斷是否有許可權這個功能就是一個切面。

2. AOP術語

2.1:連線點(Joinpoint)

程式執行的某個特定位置:如類開始初始化前,類初始化後,類某個方法呼叫前。一個類或一段程式碼擁有一些邊界性質的特定點,這些程式碼中的特定點就被稱為“連線點”。Spring僅支援方法的連線點,既僅能在方法呼叫前,方法呼叫後,方法丟擲異常時等這些程式執行點進行織入增強。我們知道黑客攻擊系統需要找到突破口,否則無法進行攻擊,從某種程度上說AOP是一個黑客,連線點就是攻擊的突破口。

連線點由兩個資訊確定:第一是用方法表示的程式執行點;第二是用相對點表示的方位。如在Test.foo()方法執行前的連線點,執行點為Test.foo(),方位為該方法執行前的位置。Spring使用切點對執行點進行定位,而方位則在增強型別中定義。

2.2:切點(Pointcut)

每個程式類都擁有多個連結點,如一個擁有兩個方法的類,這兩個方法都是連線點,既連線點是程式中客觀存在的事務。但在這為數眾多的連線點中,如何定位到某個感興趣的連線點上呢?AOP通過“切點”定位特定的連線點。通過資料庫查詢的概念來理解切點和連線點的關係再適合不過了:連線點相當於資料庫中的記錄,而切點相當於查詢條件。切點和連線點不是一對一的關係,一個切點可以匹配多個連線點。

在Spring中,切點通過org.springframework.aop.Pointcut介面進行描述,它使用類和方法作為連線點的查詢條件,SpringAOP的規則解析引擎負責解析切點所設定的查詢條件,找到對應的連線點。其實確切的說,應該是執行點而非連線點,因為連線點是方法執行前,執行後等包含方位資訊的具體程式執行點,而切點只定位到某個方法上,所以說如果希望定位到某個連線點上,還需要提供方位資訊。

2.3:增強(通知)(Advice)

增強是織入到目標類連線點上的一段程式程式碼。在Spring中,增強除了用於描述一段程式程式碼外,還擁有另一個和連線點相關的資訊,這便是執行點的方位。結合執行點方位資訊和切點資訊,我們就可以找到特定的連線點了。正因為增強即包含了用於新增到目標連結點上的一段執行邏輯,又包含了用於定位連線點的方位資訊,所以Spring所提供的增強介面都是帶方位名的:BeforeAdvice等。所以只有結合切點和增強兩者一齊上陣才能確定特定的連線點並實施增強邏輯。

2.4:目標物件(Target)

增強邏輯的織入目標類。如果沒有AOP,目標業務類需要自己實現所有邏輯,如ForumService所示。在AOP的幫助下,ForumService只實現了那些非橫切邏輯的程式邏輯,而效能監視和事務管理等這些橫切邏輯則可以使用AOP動態織入到特定的連線點上。

2.5:引介(引入)(Introduction):

引介(引入)是一種特殊的增強,它為類新增一些屬性和方法。這樣,即使一個業務類原本沒有實現某個介面,通過AOP的引介功能,我們可以動態的為該事務新增介面的實現邏輯,讓業務類成為這個介面的實現類。

2.6:織入(Weaving)

織入是將增強新增對目標類具體連線點上的過程,AOP象一臺織布機,將目標類增強或引介AOP這臺織布機天衣無縫的編織在一起。

2.7:代理(Proxy)

一個類被AOP織入增強後,就產生了一個結果類,它是融合了原類和增強邏輯的代理類。根據不同的代理方式,代理類及可能是和原類具有相同的介面的類,也可能是原類的子類,所以我們可以採用呼叫原類得相同方式呼叫代理類。

2.8:切面(Aspect)

切面由切點和增強(引介)組成,它既包括了橫切邏輯的定義,也包括了連線點的定義,SpringAOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入到切面所指定的連結點中。

注意

AOP的工作重心在於如何將增強應用於目標物件的連線點上,這裡首先包括兩個工作: 第一:如何通過切點和增強定位到連線點上; 第二:如何在增強中編寫切面的程式碼。