当前位置: 代码网 > it编程>编程语言>Java > Spring AOP 中 JoinPoint 使用详解

Spring AOP 中 JoinPoint 使用详解

2026年02月11日 Java 我要评论
一、什么是 joinpoint?在 spring aop 中,joinpoint 表示的是:一个方法执行的切入点(连接点),包含当前方法调用的全部运行时信息。你可以把它理解成:spring aop 告

一、什么是 joinpoint?

在 spring aop 中,joinpoint 表示的是:

一个方法执行的切入点(连接点),包含当前方法调用的全部运行时信息。

你可以把它理解成:

spring aop 告诉你:我要执行这个方法了,你要不要看看它是谁?参数是什么?类是谁?用的是什么注解?

二、joinpoint 能获取哪些信息?

能获取的内容使用方法
方法参数joinpoint.getargs()
目标对象(真实类)joinpoint.gettarget()
代理对象(aop 生成)joinpoint.getthis()
方法名joinpoint.getsignature().getname()
类名joinpoint.gettarget().getclass()
方法签名methodsignature
方法本体 method((methodsignature) jp.getsignature()).getmethod()
方法上的注解method.getannotation(xxx.class)

这些能力构成了 aop 一切高级玩法:幂等、防重复提交、权限校验、操作日志、审计…… 全靠 joinpoint 取参数和注解。

三、获取方法参数(最常用)

object[] args = joinpoint.getargs();
system.out.println(json.tojsonstring(args));

输出:

[{"name":"tom","age":18}]

适用场景:

  • 接口日志打印
  • 幂等签名(根据参数生成 key)
  • 参数校验
  • 审计记录

四、获取类名 + 方法名

string classname = joinpoint.gettarget().getclass().getname();
string methodname = joinpoint.getsignature().getname();

system.out.println(classname + "." + methodname);

输出:

com.demo.controller.usercontroller.createorder

适用场景:

  • 记录接口访问日志
  • 记录方法调用来源
  • 记录操作审计行为

五、获取 method 对象(获取注解的必备步骤)

joinpoint 获取 method 的正确方式:

methodsignature signature = (methodsignature) joinpoint.getsignature();
method method = signature.getmethod();

拿到 method 后你可以做什么?

六、获取方法上的注解(非常常用)

在幂等、权限控制、操作日志等 aop 场景中,你都会在方法上写注解:

@postmapping("/order/create")
@repeatsubmit(interval = 5000)
public r createorder(@requestbody orderdto dto) {
    return r.ok();
}

在 aop 内获取注解:

repeatsubmit repeatsubmit = method.getannotation(repeatsubmit.class);
int interval = repeatsubmit.interval();

这就是 aop 注解驱动业务的核心。

七、完整示例:通过 joinpoint 实现幂等签名生成

@before("@annotation(repeatsubmit)")
public void before(joinpoint joinpoint, repeatsubmit repeatsubmit) {

    // 获取 uri
    httpservletrequest request =
        ((servletrequestattributes) requestcontextholder.getrequestattributes()).getrequest();
    string uri = request.getrequesturi();

    // 获取参数
    string params = json.tojsonstring(joinpoint.getargs());

    // 获取方法本体
    methodsignature signature = (methodsignature) joinpoint.getsignature();
    method method = signature.getmethod();

    // 获取注解内容
    repeatsubmit anno = method.getannotation(repeatsubmit.class);
    long interval = anno.interval();

    system.out.println("访问接口:" + uri);
    system.out.println("参数:" + params);
    system.out.println("注解配置间隔:" + interval + " ms");
}

输出类似:

这就是 joinpoint 在幂等逻辑中最常用的三件事:

  1. 获取参数
  2. 获取方法信息
  3. 获取注解配置

八、joinpoint 的典型应用场景

场景joinpoint 的作用
防重复提交(幂等)获取参数 + 获取注解配置
业务操作日志获取类名、方法名、参数
统一异常记录获取方法名、参数
接口权限校验获取注解权限标识
慢接口报警方法计时
分布式锁标识生成参数签名

说白了:

只要你需要知道“当前被调用的方法是哪个?参数是什么?注解是什么?”就必须用 joinpoint。

九、总结

  • joinpoint 是 spring aop 中获取方法运行时信息的核心接口
  • 它能获取方法参数、类名、方法名、method 对象、注解
  • 是参数校验、日志、幂等、防重复提交、权限控制等 aop 功能的基础
  • 获取注解必须先通过 methodsignature 得到 method
  • 幂等、防重复提交中最常用的能力就是:joinpoint.getargs() + 获取注解配置

一句话总结:

joinpoint 是 aop 的“方法上下文”。只要你需要基于注解或参数做业务,就离不开它。

到此这篇关于spring aop 中 joinpoint 使用详解的文章就介绍到这了,更多相关spring aop  joinpoint 使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com