当前位置: 首页 > article >正文

Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式

以下是Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式:

// 1. 目标类(被增强的类)
package com.example;public class TargetService {public void doTask(String param) {System.out.println("执行业务逻辑,参数:" + param);}public void doTaskWithoutParam() {System.out.println("执行无参业务逻辑");}public void doTaskWithError() throws Exception {System.out.println("执行会抛异常的逻辑");throw new RuntimeException("模拟异常");}
}
// 2. 切面类(包含所有通知类型)
package com.example;import org.aspectj.lang.*;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Aspect
@Component
public class ParameterAspect {// 前置通知:通过JoinPoint获取参数@Before("execution(* com.example.TargetService.*(..))")public void beforeAdvice(JoinPoint joinPoint) {System.out.println("前置通知:方法开始");Object[] args = joinPoint.getArgs();for (Object arg : args) {System.out.println("参数值:" + arg);}}// 后置通知:返回值和参数@AfterReturning(pointcut = "execution(* com.example.TargetService.*(..))",returning = "result")public void afterReturningAdvice(JoinPoint joinPoint, Object result) {System.out.println("后置通知:方法正常返回");System.out.println("返回值:" + result);System.out.println("参数列表:" + joinPoint.getArgs());}// 异常通知:捕获异常和参数@AfterThrowing(pointcut = "execution(* com.example.TargetService.*(..))",throwing = "ex")public void afterThrowingAdvice(JoinPoint joinPoint, Throwable ex) {System.out.println("异常通知:方法抛出异常");System.out.println("异常信息:" + ex.getMessage());System.out.println("异常发生时的参数:" + joinPoint.getArgs());}// 环绕通知:直接操作ProceedingJoinPoint@Around("execution(* com.example.TargetService.*(..))")public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {System.out.println("环绕通知:方法执行前");System.out.println("方法参数:" + pjp.getArgs());try {Object result = pjp.proceed();System.out.println("环绕通知:方法执行后");return result;} catch (Throwable ex) {System.out.println("环绕通知:捕获异常");throw ex;}}// 引介通知:不直接传递参数(示例展示引入接口)@DeclareParents(value = "com.example.TargetService+",defaultImpl = AuditLogImpl.class)private AuditLog auditLog;private static class AuditLogImpl implements AuditLog {@Overridepublic void log() {System.out.println("引介通知:记录审计日志");}}
}
// 3. Spring配置类
package com.example;import org.springframework.context.annotation.*;@Configuration
@ComponentScan("com.example")
@EnableAspectJAutoProxy
public class AppConfig {@Beanpublic TargetService targetService() {return new TargetService();}
}
// 4. 测试类
public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);TargetService service = context.getBean(TargetService.class);// 测试正常流程service.doTask("参数1");// 测试无参方法service.doTaskWithoutParam();// 测试异常流程try {service.doTaskWithError();} catch (Exception e) {System.out.println("捕获到异常:" + e.getMessage());}// 测试引介接口AuditLog audit = (AuditLog) service;audit.log();}
}

关键点总结表格

通知类型参数传递方式示例代码片段参数来源说明
前置通知JoinPoint.getArgs()Object[] args = joinPoint.getArgs();直接获取方法参数数组
后置通知JoinPoint + 返回值参数public void afterReturningAdvice(JoinPoint joinPoint, Object result)返回值通过returning参数获取
异常通知JoinPoint + 异常参数public void afterThrowingAdvice(JoinPoint joinPoint, Throwable ex)异常对象通过throwing参数获取
环绕通知ProceedingJoinPointpjp.proceed()包含完整方法控制权
引介通知不直接传递参数(接口绑定)@DeclareParents通过接口实现间接关联

执行结果

前置通知:方法开始
参数值:参数1
环绕通知:方法执行前
方法参数:[参数1]
执行业务逻辑,参数:参数1
环绕通知:方法执行后
后置通知:方法正常返回
返回值:null
参数列表:[参数1]前置通知:方法开始
环绕通知:方法执行前
方法参数:[]
执行无参业务逻辑
环绕通知:方法执行后
后置通知:方法正常返回
返回值:null
参数列表:[]前置通知:方法开始
环绕通知:方法执行前
方法参数:[]
执行会抛异常的逻辑
异常通知:方法抛出异常
异常信息:模拟异常
异常发生时的参数:[]
环绕通知:捕获异常
捕获到异常:模拟异常引介通知:记录审计日志

核心要点

  1. JoinPoint:所有通知(除环绕)都通过JoinPoint对象获取参数
  2. ProceedingJoinPoint:环绕通知特有的接口,支持手动执行目标方法
  3. 参数绑定:通过注解属性(如returning/throwing)声明额外参数
  4. 参数类型:参数类型需与目标方法参数匹配,可通过joinPoint.getSignature()获取方法元数据
  5. 引介通知:主要用于类型增强,不直接参与参数传递

相关文章:

Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式

以下是Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式: // 1. 目标类(被增强的类) package com.example;public class TargetService {public void doTask(String param) {System.out.println("…...

.net平台C#对于2D/二维点云处理用哪些库?

对于单线激光雷达生成的2D点云数据的处理, 虽然比较简单, 但网上的资料比较少, PCL是避不开的, 但它主要处理的是3D点云, 对2D也可以处理, 但它是C语言的, 如果使用的是C语言开发&#x…...

PH热榜 | 2025-03-30

1. Deepcord 标语:Discord 数据分析:获取指标洞察与受众研究 介绍:Deepcord:为社区建设者提供的Discord分析工具。跟踪超过50万个服务器的指标,发现热门社区,监控竞争对手,找到你的目标受众。…...

STM32H743学习记录

2025/03/30 SRAM速率计算方式 MCU主频 乘以 单片机位数 除以 每个字节的位数(8)即可得出单片机的SRAM速率 如72M主频32位单片机速率 72 * 32 / 8 288 M/s FLASH速率计算方式 FLASH大小 乘以 单片机位数 除以 每个字节位数(8&#xff09…...

Open webui的使用

问题 之前本地量化模型管理器ollama的文章,我们知道可以通过ollama来管理本地量化模型,也能够在命令行中与相关模型进行对话。现在我们想要在有个web页面通过浏览器来与本地模型对话。这里我们就使用Open webui作为界面来与本地模型对话。 安装启动 这…...

swagger上传图片请求报错

1.如下是上传图片的接口 ApiOperation(value "WF开卡审核-关店换卡信用卡证明")PostMapping(value "/uploadPhoto/{id}")public Result<?> uploadPhoto(List<MultipartFile> file,PathVariable Long id) {return wfAuditService.uploadPhot…...

STM32单片机的桌面宠物机器人(基于HAL库)

效果 基于STM32单片机的桌面宠物机器人 概要 语音模块&#xff1a;ASR PRO&#xff0c;通过天问block软件烧录语音指令 主控芯片&#xff1a;STM32F103C8T6 使用HAL库 屏幕&#xff1a;0.96寸OLED屏&#xff0c;用来显示表情 4个舵机&#xff0c;用来当作四只腿 底部一个面…...

python 语法篇(一)

目录 1 正则匹配注意点11.1 正则匹配字符串写法1.2 创建re函数&#xff08;1&#xff09;re.search()--搜索第一个匹配项&#xff08;2&#xff09;re.match() - 从字符串开头匹配&#xff08;3&#xff09;re.findall() - 返回所有匹配项的列表&#xff08;4&#xff09;re.fi…...

【记录自己第一个github 100星项目】采用flask框架构建一个前端页面,进行OpenManus的调用,对OpenManus生成的文件进行预览。

OpenManus-WebUI...

flutter android端抓包工具

flutter做的android app&#xff0c;使用fiddler抓不了包&#xff0c;现介绍一款能支持flutter的抓包工具Reqable&#xff0c;使用方法如下&#xff1a; 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk&#xf…...

求矩阵某列的和

设计函数sum_column( int A[E1(n)][E2(n)], int j )&#xff0c;E1(n)和E2(n)分别为用宏定义的行数和列数&#xff0c;j为列号。在该函数中&#xff0c;设计指针ptr&A[0][j]&#xff0c;通过*ptr及ptrptrE2(n)访问第j列元素&#xff0c;从而求得第j列元素的和。在主函数中定…...

Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(ollama方式)

操作系统&#xff1a;Ubuntu Linux 22.04 一、安装模型运行环境 打开链接https://ollama.com/download/linux 1.安装ollama &#xff08;1&#xff09;一条指令即可实现的简易版安装方法&#xff08;也可称为在线安装&#xff09; curl -fsSL https://ollama.com/install.s…...

软件工程面试题(十五)

1、servlet 创建过程以及ruquest,response,session的生命周期? Servlet的创建过程: 第一步 public class AAA extends HttpServlet{ 实现对应的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…...

深度学习处理时间序列(6)

RNN的高级用法 循环dropout&#xff08;recurrent dropout&#xff09;​&#xff1a;这是dropout的一种变体&#xff0c;用于在循环层中降低过拟合。 循环层堆叠&#xff08;stacking recurrent layers&#xff09;​&#xff1a;这会提高模型的表示能力&#xff08;代价是更…...

【鸿蒙5.0】向用户申请麦克风授权

#效果图 步骤 在 config.json 里声明权限&#xff1a;在项目的 config.json 文件中添加麦克风权限的声明&#xff0c;告知系统应用需要使用该权限。检查权限状态&#xff1a;在代码里检查应用是否已经获得了麦克风权限。请求权限&#xff1a;若应用未获得麦克风权限&#xff0…...

用 Python 实现机器学习小项目:从入门到实战

用 Python 实现机器学习小项目&#xff1a;从入门到实战 在人工智能蓬勃发展的今天&#xff0c;机器学习早已成为技术人绕不开的关键词。无论你是初学者还是转行者&#xff0c;学习一门编程语言并通过小项目实战&#xff0c;都是掌握机器学习的最佳方式。本文将以 Python 为编程…...

从“制造”到“智造”:生产线自动检测的技术变革与实践

从“制造”到“智造”:生产线自动检测的技术变革与实践 在工业4.0的浪潮下,生产线自动检测技术正成为制造业转型升级的关键驱动力。传统的人工检测方式因效率低、误差高、成本高等问题,逐渐被更智能、更高效的自动检测技术所取代。本文将从技术背景、核心技术、应用场景以及…...

【解决】导入PNG图片,转 Sprite 格式成功但资产未生效问题

开发平台&#xff1a;Unity 6.0 图片格式&#xff1a;.png   问题描述 当 PNG 成功转换为 Sprite&#xff08;精灵&#xff09;时&#xff0c;资产状态将显示扩展箭头&#xff0c;即表明该资产可 Sprite 使用。 解决方法&#xff1a;设置正确的 Sprite Mode Single 关于 Spr…...

Maven:Java项目构建与依赖管理工具

Maven 是什么 Maven 将项目开发过程和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09;&#xff0c;本质上是一个项目管理工具。Maven 主要用于Java项目的依赖管理、编译、测试、打包和部署等操作。 Maven的核心设计围绕标准化和自动化&#xff0c;通过一系列约定和…...

Oracle数据库数据编程SQL<3.4 PL/SQL 自定义函数>

自定义函数是Oracle数据库中可重用的PL/SQL代码块&#xff0c;它接受参数、执行操作并返回一个值。函数可以在SQL语句中直接调用&#xff0c;极大增强了SQL的处理能力。 分类调用没有参数没有输入输出写SQL不加参数有参数有输入无输出写SQL加参数无输入有输出输出变量写PL/SQL…...

【Ubuntu常用命令】

1.将本地服务器文件或文件夹传输到远程服务器 文件 scp /data/a.txt administrator10.60.51.20:/home/administrator/ 文件夹 scp -r /data/ administrator10.60.51.20:/home/administrator/ 2.从远程服务器传输文件到本地服务器 scp administrator10.60.51.20:/data/a.txt /h…...

PyTorch图像预处理--Compose

torchvision.transforms.Compose 是 PyTorch 中用于图像预处理的核心工具&#xff0c;可将多个图像变换操作组合成一个顺序执行的流水线。 ‌1. 定义与作用‌ ‌功能‌&#xff1a;将多个图像处理步骤&#xff08;如缩放、裁剪、归一化等&#xff09;串联为一个整体&#xff…...

从DeepSeek到Qwen,AI大模型的移植与交互实战指南

在不久前发布的《技术实战 | OK3588-C开发板上部署DeepSeek-R1大模型的完整指南》一文中&#xff0c;小编为大家介绍了DeepSeek-R1在飞凌嵌入式OK3588-C开发板上的移植部署、效果展示以及性能评测&#xff0c;本篇文章不仅将继续为大家带来关于DeepSeek-R1的干货知识&#xff0…...

SkyWalking+Springboot实战

1、下载SkyWalking APM 1.手动下载 Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/ 2.链接下载 https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gzhttps://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-…...

算法 | 河马优化算法原理,公式,应用,算法改进及研究综述,matlab代码

以下是关于河马优化算法(Hippopotamus Optimization Algorithm, HO)的完整综述,包含原理、公式、应用场景、改进方向及可直接运行的 Matlab 完整代码。一、算法原理 河马优化算法(HO)由Amiri等人于2024年提出,是受河马群体行为启发的元启发式算法,其核心基于以下三阶段行…...

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 Maven打包失败

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 解决办法 勾上这个&#xff0c;打包时跳过测试代码...

nginx-rtmp-module之ngx_rtmp_live_module.c代码详解

ngx_rtmp_live_module.h 头文件分析 这个头文件定义了直播模块相关的结构体、函数声明和一些常量&#xff0c;主要用于支持 RTMP 协议中的直播流。 1. 核心数据结构&#xff1a; ngx_rtmp_live_chunk_stream_t&#xff1a; 该结构体用于表示一个数据流中的“块”&#xff0c;…...

【MVCC快照如何实现】

MVCC(多版本并发控制)快照的实现原理 MVCC(Multi-Version Concurrency Control)是现代数据库实现事务隔离级别的核心技术&#xff0c;它通过数据多版本和快照机制来实现高效的并发控制。下面我将详细解析MVCC快照的实现机制。 一、MVCC核心组件 1. 版本链结构 MVCC通过以下…...

在机器人和无人机时代,测绘人的出路在哪里?

一、技术革命&#xff1a;当测绘行业按下“加速键” 无人机与机器人技术正在重塑测绘行业的底层逻辑。传统测绘依赖人工作业&#xff0c;效率低、成本高且风险大&#xff0c;而无人机凭借其灵活性和高效性&#xff0c;已能快速完成大范围地形测绘&#xff0c;精度可达厘米级&a…...

linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像

Linux》》docker: 默认情况下&#xff0c;Docker镜像保存在/var/lib/docker/目录下。 当您使用docker pull命令从Docker Hub或私有镜像仓库中拉取镜像时&#xff0c;Docker会自动将镜像文件保存在/var/lib/docker/image/目录下。 每个镜像都由一个或多个层组成&#xff0c;这些…...