Spring AOP Pointcut 表達式的語法是怎樣的?(execution(...) 是最常用的,還有哪些

Pointcut 表達式是 AOP 的核心,我將詳細解析最常用的 execution 表達式,并介紹其他幾種同樣非常有用的表達式。

1. execution 指示符 (最常用,最強大)

execution 用于匹配方法的執行(Join Point)。它的語法結構最為完整,也最為靈活。

語法結構
execution( [修飾符模式]? 返回類型模式 [聲明類型模式]? 方法名模式(參數模式) [拋出異常模式]? )
  • 方括號 [] 內的部分是可選的。
  • ? 表示該部分是可選的。
語法分解與示例

讓我們通過一個具體的例子來逐一分解:
execution(public * com.example.service..*.set*(..))

部分示例含義
[修飾符模式]public匹配 public 修飾的方法。可以省略,表示匹配任何修飾符。也可以用 *
返回類型模式*匹配任意返回類型。也可以是具體的類型如 Stringvoid
[聲明類型模式]com.example.service..*.匹配方法所在的類型。這部分非常靈活:
- com.example.service.UserService:精確匹配 UserService 類。
- com.example.service.*:匹配 service 包下的任意直接類
- com.example.service..*:匹配 service及其所有子包下的任意類。最后的 . 是必需的。
方法名模式set*匹配以 set 開頭的方法名。也可以是精確的方法名 setName 或通配符 *
(參數模式)(..)匹配任意數量、任意類型的參數。這是最常用的模式。
- ():匹配無參方法。
- (*):匹配只有一個任意類型參數的方法。
- (String, ..):匹配第一個參數是 String,后面有任意數量、任意類型的參數。
[拋出異常模式](省略)匹配方法聲明拋出的異常類型。例如 throws java.io.IOException。這部分很少使用。

這個例子的完整含義是:
攔截 com.example.service 包及其所有子包中,所有類的,所有以 set 開頭的,public 修飾的,不限返回值和參數的方法。


2. 其他常用 Pointcut 指示符

除了 execution,還有一些在特定場景下非常好用的指示符。

within 指示符

within 用于限定連接點必須在指定的類型或包的范圍內。它比 execution 更粗粒度,只關心位置,不關心方法簽名。

  • 語法: within(類型或包模式)

  • 示例:

    • within(com.example.service.UserService): 匹配 UserService 類中的所有方法
    • within(com.example.service.*): 匹配 service 包下所有類中的所有方法。
    • within(com.example.service..*): 匹配 service 包及其所有子包下所有類中的所有方法。
  • execution 的區別:

    • execution(* com.example.service.UserService.*(..))within(com.example.service.UserService) 看起來相似,但 within 的粒度更大。例如,within 不關心方法的修飾符、返回類型等。
@annotation 指示符

@annotation 用于匹配持有指定注解的方法。這對于創建自定義注解來實現 AOP 非常有用,是實現聲明式功能(如聲明式日志、聲明式緩存)的最佳方式。

  • 語法: @annotation(注解類型的完全限定名)

  • 示例:

    1. 定義一個自定義注解:
      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface MyLoggable {}
      
    2. 在方法上使用注解:
      @Service
      public class MyService {@MyLoggablepublic void doSomething() { /* ... */ }
      }
      
    3. 編寫切點:
      @Pointcut("@annotation(com.example.aop.MyLoggable)")
      public void loggableMethods() {}
      
      這個切點會精確地匹配所有被 @MyLoggable 注解的方法。
@within@target
  • @within: 匹配持有指定注解的類中的所有方法。

    • 示例: @within(org.springframework.stereotype.Service) 會匹配所有被 @Service 注解的類中的所有方法。
  • @target: 匹配目標對象的類持有指定注解的所有方法。@within@target 在大多數情況下效果相同。

args@args

這兩個指示符用于根據方法的參數來匹配。

  • args(): 匹配方法的參數類型

    • args(java.lang.String, ..): 匹配第一個參數是 String 類型的方法。
    • args(): 匹配無參方法。
    • args(user): 這種形式不僅匹配參數類型,還能在通知中綁定參數值
      @Before("execution(* com.example..*.*(com.example.User)) && args(user)")
      public void processUser(User user) {//可以直接使用 user 對象System.out.println("Processing user: " + user.getName());
      }
      
  • @args(): 匹配方法的參數在運行時所持有的注解

    • @args(com.example.validation.Validatable, ..): 匹配第一個參數對象被 @Validatable 注解標注的方法。

3. 組合切點 (Combining Pointcuts)

你可以使用邏輯運算符 && (與), || (或), ! (非) 來組合多個切點,創建更復雜的規則。

@Aspect
@Component
public class SecurityAspect {// 匹配 service 包下的所有方法@Pointcut("within(com.example.service..*)")public void inServiceLayer() {}// 匹配被 @AdminOnly 注解的方法@Pointcut("@annotation(com.example.security.AdminOnly)")public void adminOnlyMethods() {}// 組合切點:在 service 層中,并且是 admin-only 的方法@Before("inServiceLayer() && adminOnlyMethods()")public void checkAdminAccess() {// ... 執行權限檢查邏輯System.out.println("Admin access granted!");}// 組合切點:不在 service 層中的所有方法@Before("!inServiceLayer()")public void nonServiceMethodLog() {// ...}
}

總結

指示符作用優點
execution最核心、最常用,匹配方法的完整簽名。最精確,控制粒度最細。
within匹配指定包或類中的所有方法。語法簡單,適合按模塊劃分。
@annotation匹配持有指定注解的方法解耦性最好,通過注解驅動AOP,業務代碼無侵入。
@within, @target匹配持有指定注解的類中的所有方法。適合對整個類別的Bean進行增強。
args, @args根據方法的參數類型或參數注解來匹配。適合處理特定類型的數據流。
**&&, `, !`**

在實際開發中,execution@annotation 是使用頻率最高的兩種方式。建議優先使用 @annotation 來實現自定義的聲明式功能,因為它能讓我們的代碼意圖更加清晰。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86433.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86433.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86433.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 SpringBoot+Vue 的臺球廳管理系統的設計與實現(畢業論文)

基于 SpringBootVue 的臺球廳管理系統的設計與實現(模板)[三號宋體加粗,居中] 摘 要[首行縮進2字符,五號黑體加粗]:摘要內容[五號楷體]本文所提出的基于J2EE/EJB標準的電子化采購平臺及其CRM組件綜合解決方案&#xf…

運營醫療信息化建設的思路

醫療機構加強運營管理,必須依賴強有力的醫院信息系統。信息化很重要,但不能為了信息化而信息化。運營信息化必須有明確的建設目標。 運營信息化建設的目標,包括幾個方面: 1.實時反映業務; 2.體現內控思維&#xff1b…

6.24_JAVA_微服務day07_RabbitMQ高級

1、 RabbitListener(queuesToDeclare/*此處是固定寫法,只能寫這個玩意兒,因為這里是庫里的方法*/ Queue(name "lazy.queue",//如果不存在就創建lazy.queue隊列durable "true",//把耐用打開arguments Argument(name "x-que…

Python打卡:Day38

知識點回顧: Dataset類的__getitem__和__len__方法(本質是python的特殊方法)Dataloader類minist手寫數據集的了解 浙大疏錦行

質量管理五大核心工具之SPC

SPC(Statistical Process Control,統計過程控制)是一種基于統計學的質量控制方法,旨在通過監控和分析生產過程數據,識別異常波動并消除異常因素,從而確保過程穩定受控,提升產品質量一致性145。以…

【世紀龍科技】新能源汽車VR虛擬體驗展示館-解鎖認知新維度

解鎖新能源汽車深度認知新維度:沉浸式 VR 虛擬體驗展示館 在科技不斷突破邊界的當下,人們對新能源汽車的探索渴望愈發強烈。無論是希望深入了解行業發展脈絡的求知者,還是想要直觀掌握汽車技術原理的學習者,傳統的展示方式似乎總…

oracle基礎審計管理

Oracle數據庫審計功能詳解(簡單易懂!) 更新時間:2024年01月30日 16:21:27 作者:前程的前程也迷茫 Oracle審計查詢是一項重要的任務,可以幫助DBA更好的管理Oracle數據庫,下面這篇文章主要給大家介紹了關于Oracle數據庫審計功能的相關資料,文中通過代碼介紹…

Day44 預訓練模型

目錄 一、預訓練的概念 二、常見的分類預訓練模型 2.1 CNN架構預訓練模型 2.2 Transformer類預訓練模型 2.3 自監督預訓練模型 三、圖像預訓練模型的發展史 四、預訓練的策略 五、預訓練代碼實戰:resnet18 六、嘗試在cifar10對比alexnet 七、嘗試通過ctrl進…

尋找兩個正序數組的中位數:二分查找的終極算法

引言:中位數的「C位之爭」 如果把數組比作排隊買奶茶的隊伍,中位數就是那個站在正中間的幸運兒——不需要知道所有人的位置,只需要找到那個「剛剛好」的中間位置。這個問題看似簡單,卻藏著算法世界的「效率密碼」,尤其…

使用tensorflow的線性回歸的例子(一)

擬合y2x1 import matplotlib.pyplot as plt import numpy as np import tensorflow as tf print(tf.__version__) %matplotlib inline #載入隨機種子 np.random.seed(5) #生成100個等差序列,每個值在-1 - 1 之間 x_data np.linspace(-1,1,100) #y 2x …

OpenLayers 渲染之矢量影像圖層

前言 :::block-1 對于像GeoJSON、KML等地理數據格式的文件,最常用的方法都是通過VectorLayer進行渲染。除此之外,還可以使用VectorImage(矢量影像圖層)進行渲染。本文主要介紹在客戶端拖動上傳GeoJSON、KML等文件,并采…

Feign 實戰指南:從 REST 替代到性能優化與最佳實踐

Feign 實戰指南:從 REST 替代到性能優化與最佳實踐 一 . Feign 替代 RestTemplate1.1 RestTemplate 方式調用存在的問題1.2 Feign 的介紹1.3 定義和使用 Feign 客戶端1.3.1 引入依賴1.3.2 添加注解1.3.3 編寫 Feign 的客戶端進行接口聲明1.3.4 測試小結 1.4 通過 PO…

什么是國際期貨?期貨交易平臺搭建

國際期貨(International Futures),又稱外盤期貨或全球期貨,是指在中國大陸以外的交易所進行標準化合約交易的金融衍生品市場。其核心特征、功能及與國內期貨的區別如下: 📍 一、定義與核心特征 全球化交易…

考取華為HCIE-AI有什么用?

在人工智能技術重塑各行各業的浪潮中,掌握核心AI能力成為專業人士的制勝關鍵。華為推出的HCIE-AI Solution Architect(華為認證ICT專家-AI解決方案架構師),正是面向這一領域頂尖人才設立的最高級別認證。主要是為了培養和認證掌握…

Maven 使用說明和配置

作者:小凱 沉淀、分享、成長,讓自己和他人都能有所收獲!😄 一、前言 Apache Maven (opens new window)是一個軟件項目管理、構建和依賴工具。基于項目對象模型 (POM) 的概念,Maven 可以通過中央信息來管理項目的構建、…

【Docker管理工具】安裝Docker容器自動更新工具Watchtower

【Docker管理工具】安裝Docker容器自動更新工具Watchtower 一、Watchtower介紹1.1 Watchtower簡介1.2 Watchtower使用注意1.3 Watchtower使用場景1.4 Docker容器介紹 二、本次實踐介紹2.1 本地環境規劃2.2 本次實踐介紹 三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版…

AI優化SEO關鍵詞精進

內容概要 隨著人工智能技術的飛速發展,其在搜索引擎優化(SEO)領域的應用正引發深刻變革。本文將系統探討AI如何革新傳統的關鍵詞優化策略,通過更智能的分析與匹配方法,顯著提升內容在搜索結果中的可見度與排名。核心議…

canvas面試題200道

下面是一份 200 條關于 HTML5 Canvas 的面試題合集,適用于前端開發崗位的中高級工程師面試準備。內容涵蓋基礎概念、繪圖操作、性能優化、動畫實現、安全機制等多個方面,并附有參考答案或解析建議。 ?? 一、Canvas 基礎知識(1-40) 1. 什么是 HTML5 Canvas? <canvas&…

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的目標軌跡預測與防范策略制定(325)

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的目標軌跡預測與防范策略制定&#xff08;325&#xff09; 引言&#xff1a;正文&#xff1a;一、Java 驅動的安防視頻數據采集與預處理架構1.1 多路異構視頻流合規接入層&#xff08;GB/T 28181-2021 全協議適配&#xff…

【Python】實現對LGBT+ rights worldwide (2025)數據集的可視化展示

我用夸克網盤分享了「lgbtq_rights_by_country數據集」&#xff0c;點擊鏈接即可保存。 鏈接&#xff1a;https://pan.quark.cn/s/aa0fa91491e8 摘要&#xff1a; 本文運用Python編程實現對LGBTQ權利相關數據的處理與可視化展示。通過直方圖與地圖兩種可視化方式&#xff0c;分…