深入了解execution表達式

隨着Spring框架的不斷發展,execution表達式作為Spring AOP切點表達式的核心語法之一,也逐漸成為了Java開發人員必備的技能之一。execution表達式主要作用是定義切點,即哪些方法或者哪些類的哪些方法需要被攔截。本文將從多個方面對execution表達式進行詳細闡述,以幫助讀者深入了解execution表達式。

一、基礎語法

execution表達式的格式為:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)throws-pattern?) 。其中,各組成部分分別表示:

  • modifiers-pattern:修飾符模式(可選),如public、private、protected、static等。
  • ret-type-pattern:返回值模式,如任何類型用*表示,void用special。
  • declaring-type-pattern:類路徑表達式(可選),如com.example.demo.*Service表示匹配com.example.demo包下所有以Service結尾的類。
  • name-pattern:方法名表達式,如*表示匹配所有方法名。
  • param-pattern:參數列表表達式,如()表示匹配無參方法,(*)表示匹配任意一個參數方法,(..)表示匹配任意個參數方法。
  • throws-pattern:異常類型表達式(可選),如表示匹配拋出RuntimeException和NullPointerException異常的方法。

舉個例子:對於一個返回類型為int,包含兩個參數的方法,名稱為add,參數類型分別為int和int的方法,可以這樣匹配:

execution(int com.example.demo.Calculator.add(int, int))

需要注意的是,在declaring-type-pattern、name-pattern、param-pattern以及throws-pattern中可以使用通配符,其中*表示匹配任何字符,..表示任意個字符。

二、修飾符模式

execution表達式的modifiers-pattern部分可以匹配方法的修飾符,如public、private、protected、static等。可以使用的修飾符模式包括:

  • public:匹配public類型的方法。
  • protected:匹配protected類型的方法。
  • private:匹配private類型的方法。
  • default:匹配default類型的方法。
  • static:匹配static類型的方法。
  • final:匹配final類型的方法。
  • native:匹配native類型的方法。
  • synchronized:匹配synchronized類型的方法。
  • abstract:匹配abstract類型的方法。

舉個例子:對於一個返回類型為void,參數個數為一個且參數類型為字符串類型,名字為log,並且是public修飾符的方法,代碼如下所示:

public void log(String message);

可以這樣匹配:

execution(public void com.example.demo.LogService.log(String))

三、返回類型模式

execution表達式的ret-type-pattern部分可以匹配返回類型,使用*來匹配任何類型,使用special來匹配void類型。

舉個例子:對於返回值為String類型的方法,可以這樣匹配:

execution(String com.example.demo.MyService.getString())

四、類路徑模式

execution表達式的declaring-type-pattern部分可以匹配類路徑,可以使用通配符*來匹配任何類,可以使用..來匹配任何路徑。

舉個例子:對於匹配類路徑為com.example.demo下所有以Service結尾的類中,名稱為add,參數列表中有兩個參數且類型為int的方法,可以這樣匹配:

execution(* com.example.demo.*Service.add(int, int))

五、方法名模式

execution表達式的name-pattern部分可以匹配方法名,可以使用通配符*匹配任何方法名。

舉個例子:對於匹配名稱包含save的方法,可以這樣匹配:

execution(* save*(..))

六、參數列表模式

execution表達式的param-pattern部分可以匹配參數列表,可以使用()表示無參方法,可以使用(*)表示匹配任意一個參數,可以使用(..)表示匹配任意多個參數。

舉個例子:對於匹配參數為兩個int類型的方法,可以這樣匹配:

execution(* *(int, int))

七、異常類型模式

execution表達式的throws-pattern部分可以匹配拋出的異常類型,可以使用通配符*匹配任何異常類型,可以使用..匹配任意異常繼承體系中的異常。

舉個例子:對於匹配拋出RuntimeException或者NullPointerException異常的方法,可以這樣匹配:

execution(* *(..) throws RuntimeException, NullPointerException)

八、結合多個表達式

可以使用&&連接多個execution表達式,讓它們都滿足才能匹配成功。

舉個例子,對於匹配類路徑為com.example.demo且名稱以Service結尾的類的任意public方法,可以這樣匹配:

execution(public * com.example.demo.*Service.*(..))

九、總結

通過本文的詳細闡述,相信讀者對execution表達式有了更加深刻的理解。execution表達式是Spring AOP切點表達式的核心語法之一,可以用來定義切點,即哪些方法或者哪些類的哪些方法需要被攔截。需要注意的是,execution表達式的格式十分靈活,可以使用多種通配符來精確匹配到需要攔截的方法。

十、代碼示例

下面給出使用execution表達式定義切面的代碼示例:

@Aspect
public class LogAspect {

    @Pointcut("execution(public * com.example.demo.*Service.*(..))")
    public void logPointCut() {}

    @Before("logPointCut()")
    public void beforeLog(JoinPoint joinPoint) {
        //在方法執行之前輸出日誌
        System.out.println("entering method: " + joinPoint.getSignature().getName());
    }

    @AfterReturning("logPointCut()")
    public void afterLog(JoinPoint joinPoint, Object result) {
        //在方法執行之後輸出日誌
        System.out.println("exiting method: " + joinPoint.getSignature().getName());
    }
}

在上述示例中,定義了一個切點logPointCut,使用了execution表達式來精確匹配需要攔截的方法。可以看出,execution表達式可以被用來定義切點,這對於使用Spring AOP進行方法攔截非常有用。

原創文章,作者:KCVYX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/351725.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KCVYX的頭像KCVYX
上一篇 2025-02-17 17:02
下一篇 2025-02-17 17:02

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱“存儲程序控制原理”,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的總線來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r為前綴的字符串。r字符串中的反斜杠(\)不會被轉義,而是被當作普通字符處理,這使得r字符串可以非常方便…

    編程 2025-04-25

發表回復

登錄後才能評論