一、什么是 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 在幂等逻辑中最常用的三件事:
- 获取参数
- 获取方法信息
- 获取注解配置
八、joinpoint 的典型应用场景
| 场景 | joinpoint 的作用 |
|---|---|
| 防重复提交(幂等) | 获取参数 + 获取注解配置 |
| 业务操作日志 | 获取类名、方法名、参数 |
| 统一异常记录 | 获取方法名、参数 |
| 接口权限校验 | 获取注解权限标识 |
| 慢接口报警 | 方法计时 |
| 分布式锁标识生成 | 参数签名 |
说白了:
只要你需要知道“当前被调用的方法是哪个?参数是什么?注解是什么?”就必须用 joinpoint。
九、总结
joinpoint是 spring aop 中获取方法运行时信息的核心接口- 它能获取方法参数、类名、方法名、method 对象、注解
- 是参数校验、日志、幂等、防重复提交、权限控制等 aop 功能的基础
- 获取注解必须先通过
methodsignature得到 method - 幂等、防重复提交中最常用的能力就是:
joinpoint.getargs()+ 获取注解配置
一句话总结:
joinpoint 是 aop 的“方法上下文”。只要你需要基于注解或参数做业务,就离不开它。
到此这篇关于spring aop 中 joinpoint 使用详解的文章就介绍到这了,更多相关spring aop joinpoint 使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论