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

news2025/4/2 0:49:46

以下是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 {
        @Override
        public void log() {
            System.out.println("引介通知:记录审计日志");
        }
    }
}
// 3. Spring配置类
package com.example;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan("com.example")
@EnableAspectJAutoProxy
public class AppConfig {
    @Bean
    public 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. 引介通知:主要用于类型增强,不直接参与参数传递

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PH热榜 | 2025-03-30

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

Open webui的使用

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

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

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

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…

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

RNN的高级用法 循环dropout(recurrent dropout)​:这是dropout的一种变体,用于在循环层中降低过拟合。 循环层堆叠(stacking recurrent layers)​:这会提高模型的表示能力(代价是更…

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

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

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

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

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

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

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

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

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

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

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

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

DeepSeek+Kimi:PPT制作的效率革命

摘要:传统PPT制作面临模板选择困难、内容逻辑混乱、设计排版能力有限以及反复修改等问题。DeepSeek和Kimi两款AI工具的组合为PPT制作提供了全新的解决方案。DeepSeek擅长内容生成与逻辑推理,能够快速生成高质量的PPT大纲和内容;Kimi则专注于长…

电影交流|基于Java+vue的电影交流平台小程序系统(源码+数据库+文档)

电影交流平台 目录 基于SprinBootvue的电影交流平台小程序系统 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 电影信息管理 3公告信息管理 4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

深度学习入门(二):从感知机到神经网络

文章目录 前言一个神经网络的例子激活函数登场3层神经网络的实现矩阵运算3层神经网络示意图符号定义第一层信号传递第二层信号传递第三层信号传递 代码实现实践:手写数字识别参考资料 前言 上一篇文章我们学习了感知机,因为它和神经网络有很多共同点&am…

AI三大主义 和 深度学习三大主义

在人工智能(AI)研究领域,"三大主义"通常指三种核心方法论或思想流派,它们代表了不同的技术路径和哲学观点。以下是主流的划分方式: 1. 符号主义(Symbolicism) 核心思想:智…

探索 Vue 中的多语言切换:<lang-radio /> 组件详解!!!

探索 Vue 中的多语言切换&#xff1a;<lang-radio /> 组件详解 &#x1f30d; 嗨&#xff0c;大家好&#xff01;&#x1f44b; 今天我们来聊聊如何在 Vue 项目中实现一个优雅的多语言切换功能——<lang-radio /> 组件。这是一个小而美的组件&#xff0c;出现在登…

搭建私人对外git空间

# 创建用户&#xff0c;指定不可登录的 Shell&#xff08;git-shell 或 /usr/sbin/nologin&#xff09; sudo adduser --system --shell /usr/bin/git-shell --group git # 验证用户配置 grep git /etc/passwd # 预期输出&#xff1a;git:x:998:998::/home/git:/usr/bin/git-s…

DeepSeek本地部署(linux)

一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 1.1在线下载安装 可复制此命令到Linux服务器进行在线下载,如下载速度过慢,可选择离线下载安装。 curl -fsSL https://ollama.com/install.sh | sh1.2离线下载安装 …