首先,直接進入主題,什麼是 AOP?
AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與 OOP( Object-Oriented Programming, 面向對象編程) 相輔相成, 提供了與 OOP 不同的抽象軟件結構的視角.
在 OOP 中, 我們以類(class)作爲我們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)
其次,什麼是 Aspect?
aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義. Spring AOP 就是負責實施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點中.
AOP 的工作重心在於如何將增強編織目標對象的連接點上, 這裏包含兩個工作:
-
如何通過 pointcut 和 advice 定位到特定的 joinpoint 上
-
如何在 advice 中編寫切面代碼.
可以簡單地認爲, 使用 @Aspect 註解的類就是切面.
第三,什麼是切點(JoinPoint)
程序運行中的一些時間點, 例如一個方法的執行, 或者是一個異常的處理.
在 Spring AOP 中, join point 總是方法的執行點。
第四,什麼是通知(Advice)?
特定 JoinPoint 處的 Aspect 所採取的動作稱爲 Advice。Spring AOP 使用一個 Advice 作爲攔截器,在 JoinPoint “周圍”維護一系列的攔截器。
第五,有哪些類型的通知(Advice)?
-
Before - 這些類型的 Advice 在 joinpoint 方法之前執行,並使用 @Before 註解標記進行配置。
-
After Returning - 這些類型的 Advice 在連接點方法正常執行後執行,並使用@AfterReturning 註解標記進行配置。
-
After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過拋出異常退出並使用 @AfterThrowing 註解標記配置時執行。
-
After (finally) - 這些類型的 Advice 在連接點方法之後執行,無論方法退出是正常還是異常返回,並使用 @After 註解標記進行配置。
-
Around - 這些類型的 Advice 在連接點之前和之後執行,並使用 @Around 註解標記進行配置。
第六,指出在 spring aop 中 concern 和 cross-cutting concern 的不同之處。
concern 是我們想要在應用程序的特定模塊中定義的行爲。它可以定義爲我們想要實現的功能。
cross-cutting concern 是一個適用於整個應用的行爲,這會影響整個應用程序。例如,日誌記錄,安全性和數據傳輸是應用程序幾乎每個模塊都需要關注的問題,因此它們是跨領域的問題。
第七, AOP 有哪些實現方式?
實現 AOP 的技術,主要分爲兩大類:
-
靜態代理 - 指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱爲編譯時增強;
編譯時編織(特殊編譯器實現)
類加載時編織(特殊的類加載器實現)。 -
動態代理 - 在運行時在內存中“臨時”生成 AOP 動態代理類,因此也被稱爲運行時增強。
JDK 動態代理
CGLIB
第八 ,Spring AOP and AspectJ AOP 有什麼區別?
Spring AOP 基於動態代理方式實現;AspectJ 基於靜態代理方式實現。
Spring AOP 僅支持方法級別的 PointCut;提供了完全的 AOP 支持,它還支持屬性級別的 PointCut。
第九,如何理解 Spring 中的代理?
將 Advice 應用於目標對象後創建的對象稱爲代理。在客戶端對象的情況下,目標對象和代理對象是相同的。
Advice + Target Object = Proxy
最後,什麼是編織(Weaving)?
爲了創建一個 advice 對象而鏈接一個 aspect 和其它應用類型或對象,稱爲編織(Weaving)。在 Spring AOP 中,編織在運行時執行。請參考下圖: