本文是全面解析面向切面編程的實踐指南。通過深入講解切面、連接點、通知等關鍵概念,以及通過XML配置實現Spring AOP的步驟。
本文分享自華為云社區(qū)《Spring高手之路18——從XML配置角度理解Spring AOP》,作者: 磚業(yè)洋__。
Spring AOP使用動態(tài)代理作為其主要機制來實現面向切面的編程。這種機制允許Spring在運行時動態(tài)地創(chuàng)建代理對象,這些代理對象包裝了目標對象(即業(yè)務組件),以便在調用目標對象的方法前后插入額外的行為(如安全檢查、事務管理、日志記錄等)。
Spring AOP
使用動態(tài)代理作為其主要機制來實現面向切面的編程。這種機制允許
Spring
在運行時動態(tài)地創(chuàng)建代理對象,這些代理對象包裝了目標對象(即業(yè)務組件),以便在調用目標對象的方法前后插入額外的行為(如安全檢查、事務管理、日志記錄等)。
JDK動態(tài)代理:當目標對象實現了一個或多個接口時,
Spring AOP
默認使用
JDK
的動態(tài)代理。
JDK
動態(tài)代理通過反射機制,為接口創(chuàng)建一個代理對象,這個代理對象會攔截對目標接口方法的所有調用。
CGLIB代理:如果目標對象沒有實現任何接口,
Spring AOP
會退回到使用
CGLIB
庫生成目標類的子類。
CGLIB
(
Code Generation Library
)是一個強大的高性能代碼生成庫,它在運行時擴展了
Java
類,并在子類中覆蓋了方法來實現方法攔截。
無論使用哪種代理方式,目的都是在不改變原有業(yè)務邏輯代碼的基礎上,通過切面定義的通知在方法執(zhí)行的不同階段插入附加行為。
切面(Aspect):切面是面向切面編程的核心,它是將橫跨多個類的關注點(如日志記錄、事務管理等)模塊化的構造。一個切面可以包含多種類型的通知(
Advice
)和一個或多個切點(
Pointcut
),用于定義在何處以及何時執(zhí)行這些通知。
連接點(Join Point):連接點代表程序執(zhí)行過程中的某個特定位置,
Spring AOP
限定這些位置為方法的調用。簡而言之,連接點就是能夠插入切面通知的點。
通知(Advice):通知定義了切面在連接點上要執(zhí)行的動作。根據通知類型的不同,這些動作可以在方法調用之前、之后、返回結果后或拋出異常時執(zhí)行。
Before advice
):在方法執(zhí)行之前執(zhí)行。
After advice
):在方法執(zhí)行后執(zhí)行,無論其結果如何。
After-returning advice
):在方法成功執(zhí)行之后執(zhí)行。
After-throwing advice
):在方法拋出異常后執(zhí)行。
Around advice
):在方法執(zhí)行之前和之后執(zhí)行,提供對方法調用的全面控制。
切點(Pointcut):切點是一個表達式,切點表達式允許通過方法名稱、訪問修飾符等條件來匹配連接點,決定了通知應該在哪些方法執(zhí)行時觸發(fā)。
目標對象(Target Object):被一個或多個切面所通知的對象。也被稱為被代理對象。
AOP代理(AOP Proxy):
AOP
框架創(chuàng)建的對象,用于實現切面契約(由通知和切點定義)。在
Spring AOP
中,
AOP
代理可以是
JDK
動態(tài)代理或
CGLIB
代理。
引入(Introduction):引入允許向現有的類添加新的方法或屬性。這是通過定義一個或多個附加接口(
Introduction interfaces
)實現的,
AOP
框架會為目標對象創(chuàng)建一個代理,該代理實現這些接口。
如果還是覺得抽象,我們再舉一個電影制作的例子來類比
切面(Aspect)
小編推薦閱讀