[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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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方法…