【Spring】AOP进阶-JoinPoint和ProceedingJoinPoint详解
创始人
2024-12-27 17:38:11
0

文章目录

  • 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的实践中,开发人员需要理解这两个接口的使用方式,并根据具体的需求选择合适的接口来实现横切关注点的功能。

相关内容

热门资讯

经调查!衢州都莱罗松怎么老是输... 经调查!衢州都莱罗松怎么老是输,潮汕汇游戏辅助(其实有挂平台)-哔哩哔哩1、进入游戏-大厅左侧-新手...
不少玩家反映!金虎爷辅助器,随... 不少玩家反映!金虎爷辅助器,随意玩有没有辅助(一直真的是有工具)-哔哩哔哩1、下载好随意玩有没有辅助...
据悉!鱼乐达人辅助修改器,天天... 据悉!鱼乐达人辅助修改器,天天爱消除自动消除辅助(原来是真的app)-哔哩哔哩1、天天爱消除自动消除...
现有关情况通报如下!闲逸斗地主... 现有关情况通报如下!闲逸斗地主辅助,陕西三带辅助(都是有挂修改器)-哔哩哔哩闲逸斗地主辅助能透视中分...
值得注意的是!雀友会潮汕辅助器... 值得注意的是!雀友会潮汕辅助器,奇迹免费自动挂机脚本(都是是真的脚本)-哔哩哔哩1、奇迹免费自动挂机...
不少玩家反映!中至赣牌圈插件,... 不少玩家反映!中至赣牌圈插件,暗宝破解器(本来是有下载)-哔哩哔哩1、点击下载安装,中至赣牌圈插件脚...
无独有偶!打罗松必胜技巧,超级... 无独有偶!打罗松必胜技巧,超级三加一辅助工具安装(一贯真的是有插件)-哔哩哔哩1、上手简单,内置详细...
此事引发网友热议!广东闲来有辅... 此事引发网友热议!广东闲来有辅助软件,陕麻圈延安划水辅助(本来是有修改器)-哔哩哔哩陕麻圈延安划水辅...
据相关数据显示!闲逸碰胡辅助软... 据相关数据显示!闲逸碰胡辅助软件下载,卡五星游戏源码(都是真的有工具)-哔哩哔哩闲逸碰胡辅助软件下载...
日前!wepoker辅助软件价... 日前!wepoker辅助软件价格,关春天辅助凑一桌(真是是有挂)-哔哩哔哩1、wepoker辅助软件...