第三章 AOP 概念與術語
3.1概念
AspectOriented Programing,麵向切麵編程。
利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
AOP主要用於日誌記錄,性能統計,安全控製(權限控製),事務處理,異常處理等。將日誌記錄,性能統計,安全控製,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的代碼。
如:AOP做權限控製的時候。首先攔截所有業務Bean時麵的所有方法,判斷用戶是否有權限,有權限才能執行這些方法。而判斷是否有權限這個功能就是一個切麵。
3.2 AOP術語
3.2.1:連接點(Joinpoint)
程序執行的某個特定位置:如類開始初始化前,類初始化後,類某個方法調用前。一個類或一段代碼擁有一些邊界性質的特定點,這些代碼中的特定點就被稱為“連接點”。Spring僅支持方法的連接點,既僅能在方法調用前,方法調用後,方法拋出異常時等這些程序執行點進行織入增強。我們知道黑客攻擊係統需要找到突破口,否則無法進行攻擊,從某種程度上說AOP是一個黑客,連接點就是攻擊的突破口。
連接點由兩個信息確定:第一是用方法表示的程序執行點;第二是用相對點表示的方位。如在Test.foo()方法執行前的連接點,執行點為Test.foo(),方位為該方法執行前的位置。Spring使用切點對執行點進行定位,而方位則在增強類型中定義。
3.2.2:切點(Pointcut)
每個程序類都擁有多個連結點,如一個擁有兩個方法的類,這兩個方法都是連接點,既連接點是程序中客觀存在的事務。但在這為數眾多的連接點中,如何定位到某個感興趣的連接點上呢?AOP通過“切點”定位特定的連接點。通過數據庫查詢的概念來理解切點和連接點的關係再適合不過了:連接點相當於數據庫中的記錄,而切點相當於查詢條件。切點和連接點不是一對一的關係,一個切點可以匹配多個連接點。
在Spring中,切點通過org.springframework.aop.Pointcut接口進行描述,它使用類和方法作為連接點的查詢條件,SpringAOP的規則解析引擎負責解析切點所設定的查詢條件,找到對應的連接點。其實確切的說,應該是執行點而非連接點,因為連接點是方法執行前,執行後等包含方位信息的具體程序執行點,而切點隻定位到某個方法上,所以說如果希望定位到某個連接點上,還需要提供方位信息。
3.2.3:增強(Advice)
增強是織入到目標類連接點上的一段程序代碼。在Spring中,增強除了用於描述一段程序代碼外,還擁有另一個和連接點相關的信息,這便是執行點的方位。結合執行點方位信息和切點信息,我們就可以找到特定的連接點了。正因為增強即包含了用於添加到目標鏈接點上的一段執行邏輯,又包含了用於定位連接點的方位信息,所以Spring所提供的增強接口都是帶方位名的:BeforeAdvice等。所以隻有結合切點和增強兩者一齊上陣才能確定特定的連接點並實施增強邏輯。
3.2.4:目標對象(Target)
增強邏輯的織入目標類。如果沒有AOP,目標業務類需要自己實現所有邏輯,如ForumService所示。在AOP的幫助下,ForumService隻實現了那些非橫切邏輯的程序邏輯,而性能監視和事務管理等這些橫切邏輯則可以使用AOP動態織入到特定的連接點上。
3.2.5:引介(Introduction):
引介是一種特殊的增強,它為類添加一些屬性和方法。這樣,即使一個業務類原本沒有實現某個接口,通過AOP的引介功能,我們可以動態的為該事務添加接口的實現邏輯,讓業務類成為這個接口的實現類。
3.2.6:織入(Weaving):
織入是將增強添加對目標類具體連接點上的過程,AOP象一台織布機,將目標類增強或引介AOP這台織布機天衣無縫的編織在一起。
3.2.7:代理(Proxy)
一個類被AOP織入增強後,就產生了一個結果類,它是融合了原類和增強邏輯的代理類。根據不同的代理方式,代理類及可能是和原類具有相同的接口的類,也可能是原類的子類,所以我們可以采用調用原類得相同方式調用代理類。
3.2.8:切麵(Aspect)
切麵由切點和增強(引介)組成,它既包括了橫切邏輯的定義,也包括了連接點的定義,SpringAOP就是負責實施切麵的框架,它將切麵所定義的橫切邏輯織入到切麵所指定的鏈接點中。
注意
AOP的工作重心在於如何將增強應用於目標對象的連接點上,這裏首先包括兩個工作:第一:如何通過切點和增強定位到連接點上;第二:如何在增強中編寫切麵的代碼。
最後更新:2017-04-03 16:48:30
上一篇:
iOS開發那些事-iOS6蘋果地圖實用開發
下一篇:
第二章 IoC Spring自動掃描和管理Bean
Activity使用Dialog樣式導致點擊空白處自動關閉的問題
《仿人機器人原理與實戰》一3.5 附加項目:電加熱板的PID控製
Java程序員—Java職業生涯規劃
Flash已死,哪項技術將會步其後塵?
【短視頻SDK】如何導入Android的AAR?動態庫so文件到底怎麼樣放呢?
計算機視覺入門基礎——計算機如何‘看’圖片。
《JavaScript和jQuery實戰手冊(原書第2版)》——2.5節操作數據類型和變量
PostgreSQL 數據庫NULL值的默認排序行為與查詢、索引定義規範 - nulls first\last, asc\desc
獨家 | 環境大數據的應用案例及前景
Linux係統中重啟tomcat的一般步驟