概念
AOP是“面向方面編程”,要解決的問題是,把重復性的橫切邏輯獨立出來,然后融合到業務邏輯中,達到和原來一樣的業務流程;
AOP的工作重心在于如何將增強應用于目標對象的連接點上。這里包括兩項工作:
- 第一、如何通過切點和增強定位到連接點上:
- 第二、如何在增強中編寫切面的代碼。
1、連接點
是程序執行的某個特定位置,如類開始初始化前、類初始化后、類的某個方法調用前/調用后、方法拋出異常后。
一個類或一段程序代碼擁有一些具有邊界性質的特定點,這些代碼中的特定點就被稱為“連接點”。
連接點由兩個信息確定:
- 一是用方法表示的程序執行點;
- 二是用相對位置表示的方位;
2、切點
每個程序類都擁有多個連接點,如一個擁有兩個方法的類,這兩個方法都是連接點,
即連接點是程序類中客觀存在的事物。
但在為數眾多的連接點中,如何定位某些感興趣的連接點呢? AOP 通過“切點”定位特定的接連點。
用數據庫查詢的概念來理解切點和連接點的關系再合適不過了:連接點相當于數據庫中的記錄,而切點相當于查詢條件。
切點和連接點不是一對一的關系,一個切點可以匹配多個連接點。
在Spring中,切點通過org.springframework.aop.Pointcut 接口進行描述,它使用類和方法作為連接點的查詢條件,SpringAOP的規則解析引擎負責解析切點所設定的查詢條件,找到對應的連接點。
確切地說,應該是執行點而非連接點,因為連接點是方法執行前、執行后等包括方位信息的具體程序執行點,而切點只定位到某個方法上,所以如果希望定位到具體的連接點上,還需要提供方位信息。
3、增強(Advice)
增強是織入目標類連接點上的一段程序代碼,在Spring中,增強除用于描述一段程序代碼外, 還擁有另一個和連接點相關的信息,這便是執行點的方位。結合執行點的方位信息和切點信息,就可以找到特定的連接。
正因為增強既包含用于添加到目標連接點上的一段執行邏輯, 又包含用于定位連接點的方位信息,所以Spring 所提供的增強接口都是帶方位名的,如BeforeAdvice 、AfterReturningAdvice、ThrowsAdvice 等。
BeforeAdvice 表示方法調用前的位置,而AferRetunningAdvice表示訪問返回后的位置。所以只有結合切點和增強,才能確定特定的連接點并實施增強邏輯。
4、目標對象(Target)
目標對象可以理解為業務邏輯,增強邏輯的織入目標類,如果沒有AOP,那么業務邏輯需要完成業務邏輯+所有非橫切邏輯;
5、引介(Introduction)
引介是一種特殊的增強,它為類添加一些屬性和方法。這樣,即使一個業務類原本沒有實現某個接口,通過AOP的引介功能,也可以動態地為該業務類添加接口的實現邏輯,讓業務類成為這個接口的實現類。
6、織入(Weaving)
織入是將增強添加到目標類的具體連接點上的過程。AOP就像一- 臺織布機,將目標類、增強或者引介天衣無縫地編織到- -起。我們不能不說“織入”這個詞太精辟了。
根據不同的實現技術,AOP有3種織入方式:
- (1)編譯期織入,這要求使用特殊的JAVA編譯器。
- (2)類裝載期織入,這要求使用特殊的類裝載器。
- (3)動態代理織入,在運行期為目標類添加增強生成子類的方式。
Spring采用動態代理織入,而AspectJ采用編譯期織入和類裝載期織入。
7、代理(Proxy)
一個類被AOP織入增強后,就產生了一個結果類,它是融合了原類和增強邏輯的代理類。
根據不同的代理方式,代理類既可能是和原類具有相同接口的類,也可能就是原類的子類,所以可以采用與調用原類相同的方式調用代理類。
8.切面(Aspect)
切面由切點和增強(引介)組成,它既包括橫切邏輯的定義,也包括連接點的定義。
Spring AOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入切面所指定的連
接點中。