切面表達式:細節決定成敗

一、切面表達式註解

註解是Java中非常重要的一種語法標記,Spring AOP中也通過註解的方式來定義切面。在定義切面時,可以使用@Aspect註解表示一個切面類,也可以使用@Before、@After、@Around等註解表示具體的切面執行時機。下面是一個使用註解定義切面並且在方法執行之前和之後打印日誌的示例:

@Aspect
public class LogAspect {
    @Before("execution(* com.example.demo.service.*.*(..))")
    public void beforeLog() {
        System.out.println("Before invoking method.");
    }
    @After("execution(* com.example.demo.service.*.*(..))")
    public void afterLog() {
        System.out.println("After invoking method.");
    }
}

在該示例中,通過@Before和@After註解來表示在目標方法執行之前和之後執行。而@Aspect註解則表示該類是一個切面類。

二、Spring切面表達式

Spring AOP支持切點表達式,可以使用表達式來匹配滿足某些條件的方法進行切面的處理。Spring AOP中使用AspectJ的切點表達式,其語法與AspectJ基本一致,但也有一些不同之處。下面是一些常用的切點表達式:

  • execution(* com.example.demo.service.*.*(..)):匹配com.example.demo.service包中所有類的所有方法。
  • execution(public * com.example.demo.service.UserService.*(..)):匹配com.example.demo.service.UserService接口中所有public方法。
  • execution(* com.example.demo.service.UserService+.*(..)):匹配com.example.demo.service.UserService接口及其所有實現類的所有方法。
  • @annotation(com.example.demo.annotation.Log):匹配所有被@Log註解標記的方法。
  • within(com.example.demo.service.*):匹配com.example.demo.service包中所有類的所有方法,但不包括子包中的。

三、切面表達式參數使用

除了上述示例中的切點表達式,還可以在切點表達式中使用參數。參數有兩種類型:JoinPoint和ProceedingJoinPoint。JoinPoint表示方法的執行時機,而ProceedingJoinPoint則表示帶有返回值的方法執行時機。下面是一個示例:

@Aspect
public class LogAspect {
    @AfterReturning(value = "@annotation(com.example.demo.annotation.Log)", returning = "result")
    public void afterLog(JoinPoint joinPoint, Object result) {
        System.out.println("After invoking method: " + joinPoint.getSignature().getName() + ", result: " + result);
    }
    @Around("@annotation(com.example.demo.annotation.Log)")
    public Object aroundLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("Before invoking method: " + proceedingJoinPoint.getSignature().getName());
        Object result = proceedingJoinPoint.proceed();
        System.out.println("After invoking method: " + proceedingJoinPoint.getSignature().getName() + ", result: " + result);
        return result;
    }
}

在該示例中,@AfterReturning註解表示在方法執行後打印方法名和返回值。而@Around註解則表示在方法執行前後打印日誌,並且通過proceed()方法繼續執行原始方法,並且可以獲取返回值。

四、切面表達式生效

在Spring AOP中,只有通過@Pointcut註解聲明的方法才能被其他切面方法調用。下面是一個示例:

@Aspect
public class LogAspect {
    @Pointcut("@annotation(com.example.demo.annotation.Log)")
    public void logPointcut() {}
    @AfterReturning(value = "logPointcut()", returning = "result")
    public void afterLog(JoinPoint joinPoint, Object result) {
        System.out.println("After invoking method: " + joinPoint.getSignature().getName() + ", result: " + result);
    }
}

在該示例中,通過@Pointcut註解聲明一個logPointcut()方法,在其他切面方法中可以使用logPointcut()方法。

五、二元函數切面的表達式

二元函數切面表示同時匹配兩個或多個切點的情況。在Spring AOP中,可以使用&&、||和!符號來實現二元函數切點。下面是一個示例:

@Aspect
public class LogAspect {
    @AfterReturning(value = "logPointcut() && execution(* com.example.demo.service.UserService.*(..))", returning = "result")
    public void afterLog(JoinPoint joinPoint, Object result) {
        System.out.println("After invoking UserService method: " + joinPoint.getSignature().getName() + ", result: " + result);
    }
}

在該示例中,使用&&符號同時匹配logPointcut()和UserService的所有方法。

六、AOP切面表達式書面表達格式選取

在書寫切面表達式時,應注意語法的正確性和表達式的簡潔性。下面是一些書寫表達式時需要注意的規則:

  • 盡量使用通配符,減少代碼量。
  • 使用括號對表達式進行分組,使運算符優先級更清晰。
  • 使用點號分割包名和類名,便於閱讀。
  • 使用註解、參數等限制條件來過濾切點,提高代碼的可讀性。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
TNLCI的頭像TNLCI
上一篇 2025-04-13 11:45
下一篇 2025-04-13 11:45

相關推薦

  • int類型變量的細節與注意事項

    本文將從 int 類型變量的定義、聲明、初始化、範圍、運算和類型轉換等方面,對 int 類型變量進行詳細闡述和講解,幫助讀者更好地掌握和應用 int 變量。 一、定義與聲明 int…

    編程 2025-04-29
  • 浮點型數據的細節揭秘

    一、基本概念 浮點型數據是指可以表示實數的一種數據類型。在C語言中,浮點型數據有兩種類型:float(單精度浮點數)和double(雙精度浮點數)。其中,float數據類型佔用4個…

    編程 2025-04-25
  • Latex加粗的使用細節

    一、Latex加粗的基本使用方法 在Latex中,加粗的基本語法是使用 \textbf{要加粗的文字} 。比如下面這個例子: The \textbf{quick} brown \t…

    編程 2025-04-25
  • :Darkgray的細節探索

    一、顏色值解析 對於前端開發來說,顏色選擇是一項非常常見的任務。要實現一個​​優雅的前端設計,我們需要學會如何選擇恰當的顏色。在這裡,我將介紹darkgray,這是一種常用的顏色,…

    編程 2025-04-24
  • 關係表達式的深度剖析

    一、關係表達式的定義 關係表達式是指在關係數據庫中為實現數據的最大效用和最快速度的數據檢索和存儲而定義的語法,表達式中的每一個元素(關係、屬性、常量等)均是數據庫的基本結構。 二、…

    編程 2025-04-23
  • biba模型的細節探究

    一、無 biba模型是一種多級安全模型,它強調了完整性比機密性更為重要。在biba模型中,所有對象和主體都被賦予一個完整性級別,而更高完整性級別的主體只能讀取更低完整性級別的對象。…

    編程 2025-04-22
  • QString contains:細節決定成敗

    一、基本概念 QString是Qt中最為常用的字符串類,其中很重要的一個函數是contains。contains函數的作用是用於判斷字符串是否包含指定的字符串,例如: QStrin…

    編程 2025-04-20
  • Java二元表達式:從基礎到優化

    一、基礎知識 Java二元表達式是指只有兩個操作數以及一個運算符的表達式,例如1+2、a<b或 x*y 。在Java語言中,對二元表達式的處理十分重要且廣泛,我們需要掌握基礎…

    編程 2025-04-18
  • Cron表達式校驗詳解

    一、Cron表達式簡介 Cron表達式是一種時間計劃工具。它是由6或7個時間元素組成的字符串,用於指定時間表。 Cron觸發器通常用於調度任務或批處理作業。 Cron表達式是指定執…

    編程 2025-04-12
  • 深入探究cron表達式驗證

    一、驗證cron表達式的重要性 1、cron表達式是一個非常常見的工具,用於定義如何在特定的間隔進行重複運行作業以及何時啟動作業。 2、驗證cron表達式的正確性非常重要,可以確保…

    編程 2025-02-25

發表回復

登錄後才能評論