[spring6: PointcutAdvisor MethodInterceptor]-簡單介紹

Advice

Advice 是 AOP 聯盟中所有增強(通知)類型的標記接口,表示可以被織入目標對象的橫切邏輯,例如前置通知、后置通知、異常通知、攔截器等。

package org.aopalliance.aop;public interface Advice {}

BeforeAdvice

前置通知的標記接口,表示增強邏輯應在目標方法調用之前執行。

public interface BeforeAdvice extends Advice {}

MethodBeforeAdvice

在目標方法執行前調用的通知接口,可訪問方法、參數和目標對象。

public interface MethodBeforeAdvice extends BeforeAdvice {void before(Method method, Object[] args, @Nullable Object target) throws Throwable;
}

AfterAdvice

后置通知的標記接口,用于標識在方法執行完成后執行的通知。

public interface AfterAdvice extends Advice {}

AfterReturningAdvice

在目標方法正常返回后執行的通知接口,能獲取返回值及方法信息。

public interface AfterReturningAdvice extends AfterAdvice {void afterReturning(@Nullable Object returnValue, Method method, Object[] args, @Nullable Object target) throws Throwable;
}

ThrowsAdvice

異常通知接口,定義在目標方法拋出異常后執行的增強邏輯(通過約定方法名實現,非標準接口方法)。

public interface ThrowsAdvice extends AfterAdvice {}

DynamicIntroductionAdvice

用于判斷當前通知是否引入了某個接口,實現 AOP 中的動態引入(引介增強)。

public interface DynamicIntroductionAdvice extends Advice {boolean implementsInterface(Class<?> intf);
}

Interceptor

Interceptor 是 AOP 聯盟中用于表示通用運行時攔截器的接口,繼承自 Advice,其子接口用于具體攔截方法、構造函數、字段訪問等連接點。

public interface Interceptor extends Advice {}

MethodInterceptor

MethodInterceptor 是實現方法環繞通知的接口,允許在目標方法調用前后執行自定義邏輯,并決定是否調用目標方法。

@FunctionalInterface
public interface MethodInterceptor extends Interceptor {@NullableObject invoke(@Nonnull MethodInvocation invocation) throws Throwable;}// `MethodInvocation` 表示方法調用的描述,是一種連接點,允許方法攔截器在方法調用時進行攔截并獲取被調用的方法信息。
public interface MethodInvocation extends Invocation {@NonnullMethod getMethod();}// `Invocation` 表示程序中的一次調用,它是一個可被攔截器攔截的連接點,并提供訪問和修改參數的能力。
public interface Invocation extends Joinpoint {@NonnullObject[] getArguments();}// `Joinpoint` 表示程序執行中的一個運行時連接點,是攔截器鏈中可被處理的事件,提供繼續執行、獲取目標對象和靜態連接點信息的方法。
public interface Joinpoint {@NullableObject proceed() throws Throwable;@NullableObject getThis();@NonnullAccessibleObject getStaticPart();}

IntroductionInterceptor

IntroductionInterceptor 是 Spring AOP 中實現引介(Introduction)功能的關鍵接口。通過它,您可以為代理對象動態引入額外的接口,并實現類似多重繼承的效果。它通常用于解決跨多個類注入統一功能(如日志、事務等)的需求,同時保持原始對象的代碼不變。

public interface IntroductionInterceptor extends MethodInterceptor, DynamicIntroductionAdvice {}

Advisor

Advisor 接口是 Spring AOP 中封裝 Advice(通知) 及其適用條件(如切點過濾器)的基礎接口。它的設計目的是統一支持不同類型的通知,如環繞通知(around advice)、前置通知(before advice)、異常通知(throws advice)等。

public interface Advisor {Advice EMPTY_ADVICE = new Advice() {};Advice getAdvice();default boolean isPerInstance() {return true;}}

IntroductionAdvisor

IntroductionAdvisor 接口繼承了 AdvisorIntroductionInfo,用于定義引入(Introduction)增強,提供過濾目標類的能力(通過 getClassFilter 方法)和驗證接口的功能(通過 validateInterfaces 方法)。IntroductionInfo 接口則提供了獲取引入接口列表的功能。

public interface IntroductionAdvisor extends Advisor, IntroductionInfo {ClassFilter getClassFilter();void validateInterfaces() throws IllegalArgumentException;}
public interface IntroductionInfo {Class<?>[] getInterfaces();}

PointcutAdvisor

PointcutAdvisor 是所有基于切點(Pointcut)驅動的通知者(Advisor)的超接口,定義了獲取驅動該通知者的切點的方法。它適用于絕大多數通知者,除了不涉及方法級匹配的引入通知者(introduction advisors)

public interface PointcutAdvisor extends Advisor {Pointcut getPointcut();}

Pointcut

Pointcut 是 Spring AOP 的核心抽象,表示切點,由 ClassFilter(類過濾器)和 MethodMatcher(方法匹配器)組成,用于定義在哪些類和方法上應用通知,且可以組合多個切點,TRUE 是一個永遠匹配的切點實例。

public interface Pointcut {ClassFilter getClassFilter();MethodMatcher getMethodMatcher();Pointcut TRUE = TruePointcut.INSTANCE;
}
ExpressionPointcut

ExpressionPointcut 是一個接口,要求實現的切點使用字符串表達式,并提供了一個方法來返回該表達式。

public interface ExpressionPointcut extends Pointcut {@NullableString getExpression();}

ClassFilter

ClassFilter 是用于限制切點或引入通知僅匹配特定目標類的過濾器接口,定義了判斷一個類是否匹配的方法 matches(Class<?> clazz),并要求實現類正確重寫 equals、hashCode 和 toString,以支持緩存和代理生成。

@FunctionalInterface
public interface ClassFilter {boolean matches(Class<?> clazz);ClassFilter TRUE = TrueClassFilter.INSTANCE;}

MethodMatcher

MethodMatcher 接口用于判斷目標方法是否符合通知條件,支持靜態匹配(只基于方法和類信息)和動態匹配(基于方法參數等運行時信息)。如果 isRuntime() 返回 false,只會調用靜態匹配方法;如果返回 true,則在每次調用前執行動態匹配。實現類需重寫 equalshashCodetoString 以支持緩存和代理場景。

public interface MethodMatcher {boolean matches(Method method, Class<?> targetClass);boolean isRuntime();boolean matches(Method method, Class<?> targetClass, Object... args);MethodMatcher TRUE = TrueMethodMatcher.INSTANCE;}
IntroductionAwareMethodMatcher

IntroductionAwareMethodMatcher 是一種擴展了 MethodMatcher 的接口,支持在匹配方法時考慮引入(introductions),以優化匹配過程。

public interface IntroductionAwareMethodMatcher extends MethodMatcher {boolean matches(Method method, Class<?> targetClass, boolean hasIntroductions);}

InstantiationModelAwarePointcutAdvisor

InstantiationModelAwarePointcutAdvisor 接口用于支持懶加載初始化策略的 Advisor,允許在真正需要時才實例化 Advice,提高性能和靈活性。

public interface InstantiationModelAwarePointcutAdvisor extends PointcutAdvisor {boolean isLazy();boolean isAdviceInstantiated();
}

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

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

相關文章

地圖定位與導航

定位 1.先申請地址權限(大致位置精準位置) module.json5文件 "requestPermissions": [{"name": "ohos.permission.INTERNET" },{"name": "ohos.permission.LOCATION","reason": "$string:app_name",&qu…

【數據結構】揭秘二叉樹與堆--用C語言實現堆

文章目錄1.樹1.1.樹的概念1.2.樹的結構1.3.樹的相關術語2.二叉樹2.1.二叉樹的概念2.2.特殊的二叉樹2.2.1.滿二叉樹2.2.2.完全二叉樹2.3.二叉樹的特性2.4.二叉樹的存儲結構2.4.1.順序結構2.4.2.鏈式結構3.堆3.1.堆的概念3.2.堆的實現3.2.1.堆結構的定義3.2.2.堆的初始化3.2.3.堆…

區間樹:多維數據的高效查詢

區間樹&#xff1a;多維數據的高效查詢 大家好&#xff0c;今天我們來探討一個在計算機科學中非常有趣且實用的數據結構——區間樹。想象一下&#xff0c;你是一位城市規劃師&#xff0c;需要快速找出某個區域內所有的醫院、學校或商場。或者你是一位游戲開發者&#xff0c;需要…

SQL 魔法:LEFT JOIN 與 MAX 的奇妙組合

一、引言 在數據庫操作的領域中&#xff0c;數據的關聯與聚合處理是核心任務之一。LEFT JOIN作為一種常用的連接方式&#xff0c;能夠將左表中的所有記錄與右表中滿足連接條件的記錄進行關聯&#xff0c;即便右表中沒有匹配的記錄&#xff0c;左表的記錄也會被保留&#xff0c;…

手寫tomcat

package com.qcby.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.TYPE)// 表示該注解只能用于類上 Retention(Retentio…

Android平臺下openssl動態庫編譯

1. 下載Linux平臺下的NDK軟件包 NDK 下載 | Android NDK | Android Developers 下載完成后執行解壓命令 # unzip android-ndk-r27d-linux.zip 2. 下載openssl-1.1.1w源碼包&#xff0c;并解壓 # tar -xzvf openssl-1.1.1w.tar.gz 3. 進入解壓后的openssl-1.1.1w目錄 …

【C++基礎】面試高頻考點解析:extern “C“ 的鏈接陷阱與真題實戰

名稱修飾&#xff08;Name Mangling&#xff09;是C為支持重載付出的代價&#xff0c;而extern "C"則是跨越語言邊界的橋梁——但橋上的陷阱比橋本身更值得警惕 一、extern "C" 的核心概念與高頻考點1.1 鏈接規范與名字改編機制C 為支持函數重載&#xff0…

OpenCV 官翻 4 - 相機標定與三維重建

文章目錄相機標定目標基礎原理代碼配置校準去畸變1、使用 cv.undistort()2、使用**重映射**方法重投影誤差練習姿態估計目標基礎渲染立方體極線幾何目標基礎概念代碼練習從立體圖像生成深度圖目標基礎概念代碼附加資源練習相機標定 https://docs.opencv.org/4.x/dc/dbb/tutori…

Python類中方法種類與修飾符詳解:從基礎到實戰

文章目錄Python類中方法種類與修飾符詳解&#xff1a;從基礎到實戰一、方法類型總覽二、各類方法詳解1. 實例方法 (Instance Method)2. 類方法 (Class Method)3. 靜態方法 (Static Method)4. 抽象方法 (Abstract Method)5. 魔術方法 (Magic Method)三、方法修飾符對比表四、綜合…

VSCode使用Jupyter完整指南配置機器學習環境

接下來開始機器學習部分 第一步配置環境&#xff1a; VSCode使用Jupyter完整指南 1. 安裝必要的擴展 打開VSCode&#xff0c;按 CtrlShiftX 打開擴展市場&#xff0c;搜索并安裝以下擴展&#xff1a; 必裝擴展&#xff1a; Python (Microsoft官方) - Python語言支持Jupyter (Mi…

數據結構與算法之美:拓撲排序

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《C修煉之路》、《Linux修煉&#xff1a;終端之內 洞悉真理…

Ubuntu18.04 系統重裝記錄

Ubuntu18.04 系統重裝記錄 1 安裝google拼音 https://blog.csdn.net/weixin_44647619/article/details/144720947 你好&#xff01; 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章&#xff0c;了解一下Markdo…

Maven常用知識總結

Maven常用知識總結Maven 安裝與配置windows mvn安裝與配置IntelliJ IDEA 配置IntelliJ IDEA 配置系統mavenIntellij IDEA Maven使用IntelliJ IDEA 不能運行項目常見問題pom.xml 常用標簽講解parentgroupId artifactId versiondependencypropertiespluginpackagingdependencyMan…

PHP框架在大規模分布式系統的適用性如何?

曾幾何時&#xff0c;PHP被貼上“只適合小網站”的標簽。但在技術飛速發展的今天&#xff0c;PHP框架&#xff08;如Laravel、Symfony、Hyperf、Swoft等&#xff09; 早已脫胎換骨&#xff0c;勇敢地闖入了大規模分布式系統的疆域。今天&#xff0c;我們就來聊聊它的真實戰斗力…

DC-DC降壓轉換5.5V/3A高效率低靜態同步降壓轉換具有自適應關斷功能

概述&#xff1a;PC1032是一款高效且體積小巧的同步降壓轉換器&#xff0c;適用于低輸入電壓應用。它是緊湊設計的理想解決方案。其2.5V至5.5V的輸入電壓范圍適用于幾乎所有電池供電的應用。在中等至重負載范圍內&#xff0c;它以1.5MHz&#xff08;典型值&#xff09;的PWM模式…

min_25篩學習筆記+牛客多校02E

本來沒有學習這種較難的算法的想法的&#xff0c;因為比賽也做不到這種難度的題&#xff0c; 但是最近打牛客多校02&#xff0c;有一題要求 [1,n][1,n][1,n] 中素數的個數&#xff0c;我以為是像莫反一樣容斥&#xff0c;但是后面感覺不行。賽后知道是用 min_25 篩來求&#xf…

FunASR Paraformer-zh:高效中文端到端語音識別方案全解

項目簡介 FunASR 是阿里巴巴達摩院開源的端到端語音識別工具箱,集成了多種語音識別、語音活動檢測(VAD)、說話人識別等模塊。其中 paraformer-zh 和 paraformer-zh-streaming 是針對中文語音識別任務優化的端到端模型,分別適用于離線和流式場景。Paraformer 采用并行 Tran…

數據結構自學Day9: 二叉樹的遍歷

一、二叉樹的遍歷“遍歷”就是按某種規則 依次訪問樹中的每個節點&#xff0c;確保 每個節點都被訪問一次且只訪問一次遍歷&#xff1a;前序 中序 后序&#xff08;深度優先&#xff09;&#xff0c;層序&#xff08;廣度優先&#xff09;類型遍歷方法特點深度優先遍歷前序、中…

Leetcode(7.16)

求二叉樹最小深度class Solution {public int minDepth(TreeNode root) {if (root null) {return 0;}Queue<TreeNode> queue new LinkedList<>();queue.offer(root);int depth 0;while (!queue.isEmpty()) {depth;int levelSize queue.size();for (int i 0; i…

Go從入門到精通(25) - 一個簡單web項目-實現鏈路跟蹤

Go從入門到精通(25) 一個簡單web項目-實現鏈路跟蹤 文章目錄Go從入門到精通(25)前言為什么需要分布式鏈路跟蹤&#xff1f;go實現鏈路跟蹤搭建zipkin 服務安裝依賴添加tracing包&#xff0c;OpenTelemetry 和Zipkin在 Gin 中集成 OpenTelemetry 中間件log包添加獲取traceId方法…