天天看點

又是一季金三銀四,Spring之AOP知識要點總結

作者:Java程式設計世界
又是一季金三銀四,Spring之AOP知識要點總結

在Spring架構中,AOP(面向切面程式設計)是一個重要的元件,它提供了一種有效的方法來解決橫切關注點(cross-cutting concerns)的問題,例如日志記錄、安全性、事務處理等。AOP的實作依賴于三個關鍵的概念:切點(pointcut)、通知(advice)和切點表達式(pointcut expression)。

1. 切點(pointcut)

切點是AOP中最基本的概念之一,它指定了在哪些地方和何時執行通知。通俗來講,切點就是一組條件,這些條件會比對程式中的某些位置。當程式運作到這些位置時,與之關聯的通知會被執行。

在Spring架構中,切點可以通過以下方式進行聲明:

@Pointcut("execution(* com.example.service.*.*(..))")
private void serviceMethod() {}           

在上述代碼中,@Pointcut注解用于聲明一個切點,這個切點指定了比對所有com.example.service包中任意類的任意方法。切點表達式中的*表示任意字元,..表示任意數量的參數。這個切點可以比對類似com.example.service.UserService.addUser(String name)這樣的方法。

除了execution表達式之外,Spring還支援其他類型的切點,例如within(比對指定包中的所有方法)、args(比對指定參數類型的方法)等。

又是一季金三銀四,Spring之AOP知識要點總結

2. 通知(advice)

通知是在切點比對的位置執行的代碼塊。通知可以在目标方法執行之前、之後或者發生異常時執行。在Spring架構中,通知可以通過以下方式進行聲明:

@Before("serviceMethod()")
public void doBefore() {
    // 在目标方法執行之前執行的代碼
}           

在上述代碼中,@Before注解用于聲明一個前置通知(before advice),這個通知會在serviceMethod()切點比對的位置執行。在這個例子中,我們執行了一些代碼來記錄請求的一些參數資訊。

Spring支援的通知類型包括:

  • @Before:在目标方法執行之前執行
  • @After:在目标方法執行之後執行,無論是否發生異常
  • @AfterReturning:在目标方法正常執行并傳回結果時執行
  • @AfterThrowing:在目标方法抛出異常時執行
  • @Around:可以完全控制目标方法的執行過程,包括是否執行目标方法,以及在何時執行目标方法。
又是一季金三銀四,Spring之AOP知識要點總結

3. 切點表達式(pointcut)

切點表達式用于指定切點的比對規則。在Spring AOP中,切點表達式是一個字元串,用于描述要比對的切點的規則。切點表達式中包含多個關鍵字和符号,例如通配符(*)、邏輯運算符(&&、||、!)、參數比對符(args())、方法比對符(execution())、類型比對符(within())等。

下面是一個使用切點表達式的例子:

@Pointcut("execution(* com.example.service.*.*(..)) && args(name,..)")
private void serviceMethod(String name) {}           

在上述代碼中,我們使用了兩個關鍵字:execution和args。execution用于比對指定包下的方法,*通配符表示比對任意方法名。args用于比對指定類型的參數,這裡我們使用了name參數來限制比對。

又是一季金三銀四,Spring之AOP知識要點總結

知識要點

除了上述三個關鍵概念外,還有一些與Spring AOP相關的知識點:

1. AOP代理

Spring架構使用動态代理來實作AOP,它可以代理目标對象并在方法執行前後添加通知。Spring支援兩種代理方式:JDK動态代理和CGLIB動态代理。JDK動态代理要求目标對象必須實作一個接口,而CGLIB動态代理可以對任何類進行代理。

2. AOP切面

切面是AOP的一個重要概念,它是通知和切點的組合。一個切面可以包含多個通知和多個切點,用于描述一組關注點。

3. AOP順序

Spring AOP中的通知可以通過@Order注解來指定執行順序。如果不指定順序,則按照通知類型的預設順序執行。

4. AOP異常處理

當目标方法抛出異常時,Spring AOP可以通過@AfterThrowing注解來捕獲異常并執行指定的通知。

5. AOP表達式語言(EL)

Spring AOP支援使用表達式語言(EL)來定義切點表達式。EL語言是一種簡單的表達式語言,用于在運作時動态地計算表達式的值。使用EL語言可以更友善地定義切點表達式,使得代碼更易于維護。

又是一季金三銀四,Spring之AOP知識要點總結