springboot 集成 aop,ProceedingJoinPoint 对象基础用法-ProceedingJoinPoint和JoinPoint的主要区别

‌ProceedingJoinPoint和JoinPoint的主要区别在于它们在AOP通知中的使用方式和功能。‌

proceedingjoinpoint和joinpoint虽然都与软件开发中的某些流程或事件有关,但两者存在明显区别。简单来说,joinpoint关注的是软件开发过程中的某个具体事件或状态,而proceeding Join Point则更侧重于描述这一过程或事件的进展状态。

在计算机编程领域,尤其是在面向切面编程(AOP)中,"JoinPoint"(连接点)和"ProceedingJoinPoint"是两个重要的概念。它们在AOP框架中扮演着不同的角色。下面我会用通俗易懂的语言来解释它们的区别:

  1. JoinPoint(连接点)

    • 想象一下,你正在观看一部电影,电影中有很多场景(Scenes),每个场景都是故事的一部分。在AOP中,JoinPoint就像这些场景,它们是程序执行流程中的特定点,比如方法的调用、异常的抛出等。
    • JoinPoint代表了程序中可以插入额外逻辑的地方,但本身并不包含执行这些逻辑的能力。
  2. ProceedingJoinPoint(继续连接点)

    • 现在,假设你在观看电影时,可以在某个特定场景暂停,然后加入一些额外的情节,比如广告或者幕后花絮,然后再继续播放原来的电影。ProceedingJoinPoint就像这个可以暂停和加入额外情节的能力。
    • 在AOP中,ProceedingJoinPoint是JoinPoint的一个子类型,它不仅代表了程序中的一个点,还具有继续执行原有逻辑的能力。这意味着,当你在ProceedingJoinPoint处插入额外逻辑后,可以选择继续执行原方法,也可以选择不执行。

简单来说,JoinPoint是程序中可以进行干预的点,而ProceedingJoinPoint不仅告诉你这个点在哪里,还允许你控制是否继续执行后面的代码。这就像是在观看电影时,ProceedingJoinPoint给了你一个遥控器,让你可以选择是否跳过广告继续观看电影。

 ‌使用方式‌:
                ‌ProceedingJoinPoint‌主要用于环绕通知(around advice),因为它继承了JoinPoint接口,并在其基础上暴露出proceed方法。这个proceed方法在环绕通知中起到了重要的作用,用于启动目标方法的执行。通过ProceedingJoinPoint对象,可以获取连接点的相关信息,并且在环绕通知中对目标方法进行控制和干预。


 ‌              JoinPoint‌则适用于四大通知类型,包括前置通知、后置通知、异常通知和最终通知。它主要用于记录运行的数据,通过它可以获取连接点的信息,如方法名、参数等,但无法控制方法的执行。
 ‌功能‌:
                ‌ProceedingJoinPoint‌具有一个特殊的方法proceed(),这是它的核心功能,用于继续执行连接点。在AOP编程中,ProceedingJoinPoint可以用来获取连接点的信息,并且可以通过调用proceed()方法来继续执行连接点。
‌                JoinPoint‌则主要用于获取连接点的信息,如方法名、参数等,但不具备控制方法执行的功能。

                总的来说,ProceedingJoinPoint和JoinPoint都是Spring AOP中的重要概念,前者主要用于控制方法的执行和在环绕通知中获取连接点信息,而后者主要用于记录运行数据和获取连接点的基本信息‌

在Spring AOP中,ProceedingJoinPoint用于环绕通知(Around advice),通过它可以访问被通知方法的信息和参数。常用方法如下:

1.执行目标方法---ProceedingJoinPoint.proceed()方法的主要作用是让目标方法执行。

2. 获取切入点所在目标对象---proceedingJoinPoint.getTarget()

3. 获取切入点方法的名字---proceedingJoinPoint.getSignature().getName()

4. 获取方法上的注解

 Object target = proceedingJoinPoint.getTarget();
        String methodName = proceedingJoinPoint.getSignature().getName();
 
        Method method = null;
        for (Method m : target.getClass().getMethods()) {
            if (m.getName().equals(methodName)) {
                System.out.println(Arrays.toString(m.getDeclaredAnnotations()));;
                break;
            }
        }

5.获取方法的参数----proceedingJoinPoint.getArgs()

6.ProceedingJoinPoint.getSignature()).getMethod()的作用:是获取当前正在执行的方法的Method对象

 

 

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值