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

【Spring】AOP进阶-JoinPoint和ProceedingJoinPoint详解

文章目录

  • 1. 前言
  • 2. JoinPoint简介
  • 3. 获取被增强方法的相关信息
  • 4. ProceedingJoinPoint简介
  • 5. 获取环绕通知方法的相关信息
  • 6. 总结

1. 前言

在Spring AOP中,JoinPoint和ProceedingJoinPoint都是关键的接口,用于在切面中获取方法的相关信息以及控制方法的执行。它们的主要区别在于它们在AOP通知中的使用方式和功能。

2. JoinPoint简介

Joinpoint是面向切面编程(AOP)中的一个重要概念,指的是在应用程序执行过程中可以被拦截的特定点。在AOP中,Joinpoint代表了程序执行的某个具体位置,比如方法的调用、异常的抛出等。AOP框架通过拦截这些Joinpoint来插入额外的逻辑,实现横切关注点的功能。

⭐我们可以通过JoinPoint获取到除了异常参数对象和返回值之外的所有信息

示例:
在这里插入图片描述
可以看到JoinPoint有很多方法.我们可以使用断点调试来看这些方法是干什么用的.
在方法的参数中添加JoinPoint参数
在这里插入图片描述
打上断点,进行调试,可以看到JoinPoint相关参数
在这里插入图片描述
在这里插入图片描述
在这里可以调试相应的方法在这里插入图片描述
例如:
在这里插入图片描述
当然如果觉得麻烦,也可以直接写代码进行调试,如:
在这里插入图片描述
JoinPoint相应的方法都可以通过这种方式来调试.由于篇幅原因这里就不过多演示了

3. 获取被增强方法的相关信息

常用方法如下:

  1. 获取方法调用时,传入的参数

    Object[] args = joinPoint.getArgs();
    
  2. 获取被通知的目标对象

    Object target = joinPoint.getTarget();
    
  3. 获取代理方法的信息

    MethodSignature signature = (MethodSignature) joinPoint.getSignature(); // 获取代理方法的信息
    String methodName = signature.getName(); // 获取方法名
    Class<?> returnType = signature.getReturnType(); // 获取返回类型
    Class<?>[] parameterTypes = signature.getParameterTypes(); // 获取参数类型数组
    

在这个示例中,我们首先使用joinPoint.getSignature() 方法获取代理方法的信息,然后将其转换为MethodSignature类型的对象。接着我们可以通过MethodSignature对象的方法获取方法名、返回类型、参数类型等信息,用于在通知中进行处理。

  1. 获取增强方法中返回值

    @AfterReturning(value = "point()",returning = "ret")
    public void methodAfterReturning(JoinPoint joinPoint, Object ret){System.out.println("AfterReturning");
    }
    
  2. 获取增强方法中的异常对象

    @AfterThrowing(value = "point()",throwing = "e")
    public void methodAfterThrowing(JoinPoint joinPoint,Throwable e){System.out.println("AfterThrowing");
    }
    

⭐注意注解中的写法,加了一些参数,同时要将目标方法赋值给value,此外获取增强方法中的返回值,并不一定是要Object类型的,可根据需求自行调整

总的来说,Joinpoint代表了AOP中能够被拦截的程序执行点,通过拦截这些Joinpoint来实现横切关注点的功能。在Spring的AOP中,理解和使用Joinpoint是非常重要的。

以上的JoinPoint都是用在添加@Before,@AfterReturning,@After,@AfterThrowing这四个注解的方法上的,而环绕通知则不同,使用的是ProceedingJoinPoint

4. ProceedingJoinPoint简介

在Spring AOP中,ProceedingJoinPoint是JoinPoint的子接口,它专门用于环绕通知(Around advice)。ProceedingJoinPoint包含了被通知方法的执行信息,同时可以访问被通知方法的信息和参数。可以通过使用ProceedingJoinPoint接口来实现更加灵活和精细的环绕通知逻辑。

5. 获取环绕通知方法的相关信息

ProceedingJoinPoint接口提供了以下常用方法:

  1. proceed():这是ProceedingJoinPoint接口中最重要的方法。在环绕通知中,调用proceed()方法会继续执行被通知的方法。如果环绕通知中不调用proceed()方法,被通知的方法将不会执行。
@Around("execution(* com.example.service.*.*(..))")
public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {// 执行前置逻辑Object result = joinPoint.proceed(); // 继续执行被通知的方法// 执行后置逻辑return result;
}

​ 注意joinPoint.proceed()方法是可能有返回值的,返回值类型可能有很多,可以直接设置为Object类型

  1. getArgs():获取被通知方法的参数数组。
Object[] args = joinPoint.getArgs();
  1. getTarget():获取被通知的目标对象。
Object target = joinPoint.getTarget();

ProceedingJoinPoint接口的主要作用是在环绕通知中控制被通知方法的执行,同时可以访问被通知方法的信息和参数。开发人员可以通过使用ProceedingJoinPoint接口来实现更加灵活和精细的环绕通知逻辑。

6. 总结

JoinPoint用于获取方法的信息,而ProceedingJoinPoint除了能获取方法的信息外,还可以控制方法的执行,这使得它在环绕通知中非常有用。在AOP的实践中,开发人员需要理解这两个接口的使用方式,并根据具体的需求选择合适的接口来实现横切关注点的功能。

相关文章:

  • 实力进阶,教你使用thinkphp6开发一款商城系统
  • 电力感知边缘计算网关产品设计方案-网关软件架构
  • 金融业务系统: Service Mesh用于安全微服务集成
  • 好用的开源项目地址
  • ImportError: DLL load failed while importing _iterative: %1 不是有效的 Win32 应用程序。
  • 业务架构、技术架构、项目管理的有机结合
  • 【图像处理】:Otsu算法最大类间方差法(大津算法:附源码)
  • cp: can‘t stat ‘/usr/share/zoneinfo/Asia/Shanghai‘: No such file or directory
  • PyTorch 实战之水果分类
  • 嵌入式系统中相关的高质量开源项目
  • 单片机FLASH下载算法的制作
  • 数学才是顶级码农的核心修养,码农怎样搞好数学?来看看这些网友强推的数学神作!文末评论区进行评论参与送书哟
  • AWS实战(一)-创建S3 存储桶
  • pythom导出mysql指定binlog文件
  • 千年TGS服务器日志报错如何解决
  • JavaScript-如何实现克隆(clone)函数
  • 自己简单写的 事件订阅机制
  • crontab执行失败的多种原因
  • express + mock 让前后台并行开发
  • gops —— Go 程序诊断分析工具
  • JavaScript异步流程控制的前世今生
  • Python爬虫--- 1.3 BS4库的解析器
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 大快搜索数据爬虫技术实例安装教学篇
  • 对象管理器(defineProperty)学习笔记
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于Android乐音识别(2)
  • 基于游标的分页接口实现
  • 聊聊flink的TableFactory
  • 网页视频流m3u8/ts视频下载
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • %@ page import=%的用法
  • (42)STM32——LCD显示屏实验笔记
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)appium-desktop定位元素原理
  • (原創) 未来三学期想要修的课 (日記)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net接口调试与案例
  • .net中调用windows performance记录性能信息
  • @31省区市高考时间表来了,祝考试成功
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [C#]获取指定文件夹下的所有文件名(递归)