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参数获取 |
| 环绕通知 | ProceedingJoinPoint | pjp.proceed() | 包含完整方法控制权 |
| 引介通知 | 不直接传递参数(接口绑定) | @DeclareParents | 通过接口实现间接关联 |
执行结果:
前置通知:方法开始
参数值:参数1
环绕通知:方法执行前
方法参数:[参数1]
执行业务逻辑,参数:参数1
环绕通知:方法执行后
后置通知:方法正常返回
返回值:null
参数列表:[参数1]前置通知:方法开始
环绕通知:方法执行前
方法参数:[]
执行无参业务逻辑
环绕通知:方法执行后
后置通知:方法正常返回
返回值:null
参数列表:[]前置通知:方法开始
环绕通知:方法执行前
方法参数:[]
执行会抛异常的逻辑
异常通知:方法抛出异常
异常信息:模拟异常
异常发生时的参数:[]
环绕通知:捕获异常
捕获到异常:模拟异常引介通知:记录审计日志
核心要点:
- JoinPoint:所有通知(除环绕)都通过
JoinPoint对象获取参数 - ProceedingJoinPoint:环绕通知特有的接口,支持手动执行目标方法
- 参数绑定:通过注解属性(如
returning/throwing)声明额外参数 - 参数类型:参数类型需与目标方法参数匹配,可通过
joinPoint.getSignature()获取方法元数据 - 引介通知:主要用于类型增强,不直接参与参数传递
相关文章:
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)…...
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单片机的桌面宠物机器人 概要 语音模块:ASR PRO,通过天问block软件烧录语音指令 主控芯片:STM32F103C8T6 使用HAL库 屏幕:0.96寸OLED屏,用来显示表情 4个舵机,用来当作四只腿 底部一个面…...
python 语法篇(一)
目录 1 正则匹配注意点11.1 正则匹配字符串写法1.2 创建re函数(1)re.search()--搜索第一个匹配项(2)re.match() - 从字符串开头匹配(3)re.findall() - 返回所有匹配项的列表(4)re.fi…...
【记录自己第一个github 100星项目】采用flask框架构建一个前端页面,进行OpenManus的调用,对OpenManus生成的文件进行预览。
OpenManus-WebUI...
flutter android端抓包工具
flutter做的android app,使用fiddler抓不了包,现介绍一款能支持flutter的抓包工具Reqable,使用方法如下: 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk…...
求矩阵某列的和
设计函数sum_column( int A[E1(n)][E2(n)], int j ),E1(n)和E2(n)分别为用宏定义的行数和列数,j为列号。在该函数中,设计指针ptr&A[0][j],通过*ptr及ptrptrE2(n)访问第j列元素,从而求得第j列元素的和。在主函数中定…...
Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(ollama方式)
操作系统:Ubuntu Linux 22.04 一、安装模型运行环境 打开链接https://ollama.com/download/linux 1.安装ollama (1)一条指令即可实现的简易版安装方法(也可称为在线安装) 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(recurrent dropout):这是dropout的一种变体,用于在循环层中降低过拟合。 循环层堆叠(stacking recurrent layers):这会提高模型的表示能力(代价是更…...
【鸿蒙5.0】向用户申请麦克风授权
#效果图 步骤 在 config.json 里声明权限:在项目的 config.json 文件中添加麦克风权限的声明,告知系统应用需要使用该权限。检查权限状态:在代码里检查应用是否已经获得了麦克风权限。请求权限:若应用未获得麦克风权限࿰…...
用 Python 实现机器学习小项目:从入门到实战
用 Python 实现机器学习小项目:从入门到实战 在人工智能蓬勃发展的今天,机器学习早已成为技术人绕不开的关键词。无论你是初学者还是转行者,学习一门编程语言并通过小项目实战,都是掌握机器学习的最佳方式。本文将以 Python 为编程…...
从“制造”到“智造”:生产线自动检测的技术变革与实践
从“制造”到“智造”:生产线自动检测的技术变革与实践 在工业4.0的浪潮下,生产线自动检测技术正成为制造业转型升级的关键驱动力。传统的人工检测方式因效率低、误差高、成本高等问题,逐渐被更智能、更高效的自动检测技术所取代。本文将从技术背景、核心技术、应用场景以及…...
【解决】导入PNG图片,转 Sprite 格式成功但资产未生效问题
开发平台:Unity 6.0 图片格式:.png 问题描述 当 PNG 成功转换为 Sprite(精灵)时,资产状态将显示扩展箭头,即表明该资产可 Sprite 使用。 解决方法:设置正确的 Sprite Mode Single 关于 Spr…...
Maven:Java项目构建与依赖管理工具
Maven 是什么 Maven 将项目开发过程和管理过程抽象成一个项目对象模型(POM),本质上是一个项目管理工具。Maven 主要用于Java项目的依赖管理、编译、测试、打包和部署等操作。 Maven的核心设计围绕标准化和自动化,通过一系列约定和…...
Oracle数据库数据编程SQL<3.4 PL/SQL 自定义函数>
自定义函数是Oracle数据库中可重用的PL/SQL代码块,它接受参数、执行操作并返回一个值。函数可以在SQL语句中直接调用,极大增强了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 中用于图像预处理的核心工具,可将多个图像变换操作组合成一个顺序执行的流水线。 1. 定义与作用 功能:将多个图像处理步骤(如缩放、裁剪、归一化等)串联为一个整体ÿ…...
从DeepSeek到Qwen,AI大模型的移植与交互实战指南
在不久前发布的《技术实战 | OK3588-C开发板上部署DeepSeek-R1大模型的完整指南》一文中,小编为大家介绍了DeepSeek-R1在飞凌嵌入式OK3588-C开发板上的移植部署、效果展示以及性能评测,本篇文章不仅将继续为大家带来关于DeepSeek-R1的干货知识࿰…...
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 解决办法 勾上这个,打包时跳过测试代码...
nginx-rtmp-module之ngx_rtmp_live_module.c代码详解
ngx_rtmp_live_module.h 头文件分析 这个头文件定义了直播模块相关的结构体、函数声明和一些常量,主要用于支持 RTMP 协议中的直播流。 1. 核心数据结构: ngx_rtmp_live_chunk_stream_t: 该结构体用于表示一个数据流中的“块”,…...
【MVCC快照如何实现】
MVCC(多版本并发控制)快照的实现原理 MVCC(Multi-Version Concurrency Control)是现代数据库实现事务隔离级别的核心技术,它通过数据多版本和快照机制来实现高效的并发控制。下面我将详细解析MVCC快照的实现机制。 一、MVCC核心组件 1. 版本链结构 MVCC通过以下…...
在机器人和无人机时代,测绘人的出路在哪里?
一、技术革命:当测绘行业按下“加速键” 无人机与机器人技术正在重塑测绘行业的底层逻辑。传统测绘依赖人工作业,效率低、成本高且风险大,而无人机凭借其灵活性和高效性,已能快速完成大范围地形测绘,精度可达厘米级&a…...
linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像
Linux》》docker: 默认情况下,Docker镜像保存在/var/lib/docker/目录下。 当您使用docker pull命令从Docker Hub或私有镜像仓库中拉取镜像时,Docker会自动将镜像文件保存在/var/lib/docker/image/目录下。 每个镜像都由一个或多个层组成,这些…...
