文章目录
- [一、什么是 JoinPoint?](#一、什么是 JoinPoint?)
- [二、JoinPoint 能获取哪些信息?](#二、JoinPoint 能获取哪些信息?)
- 三、获取方法参数(最常用)
- [四、获取类名 + 方法名](#四、获取类名 + 方法名)
- [五、获取 Method 对象(获取注解的必备步骤)](#五、获取 Method 对象(获取注解的必备步骤))
- 六、获取方法上的注解(非常常用)
- [七、完整示例:通过 JoinPoint 实现幂等签名生成](#七、完整示例:通过 JoinPoint 实现幂等签名生成)
- [八、JoinPoint 的典型应用场景](#八、JoinPoint 的典型应用场景)
- 九、总结
在 AOP 开发中,我们经常会接触到 JoinPoint ------ 它是拦截方法时最重要的上下文对象。
但很多人只知道它能"拿参数",却不知道它真正能做什么、如何正确使用、能解决哪些问题。
一、什么是 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 取参数和注解。
三、获取方法参数(最常用)
java
Object[] args = joinPoint.getArgs();
System.out.println(JSON.toJSONString(args));
输出:
[{"name":"Tom","age":18}]
适用场景:
- 接口日志打印
- 幂等签名(根据参数生成 Key)
- 参数校验
- 审计记录
四、获取类名 + 方法名
java
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
System.out.println(className + "." + methodName);
输出:
com.demo.controller.UserController.createOrder
适用场景:
- 记录接口访问日志
- 记录方法调用来源
- 记录操作审计行为
五、获取 Method 对象(获取注解的必备步骤)
JoinPoint 获取 Method 的正确方式:
java
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
拿到 Method 后你可以做什么?
六、获取方法上的注解(非常常用)
在幂等、权限控制、操作日志等 AOP 场景中,你都会在方法上写注解:
java
@PostMapping("/order/create")
@RepeatSubmit(interval = 5000)
public R createOrder(@RequestBody OrderDTO dto) {
return R.ok();
}
在 AOP 内获取注解:
java
RepeatSubmit repeatSubmit = method.getAnnotation(RepeatSubmit.class);
int interval = repeatSubmit.interval();
这就是 AOP 注解驱动业务的核心。
七、完整示例:通过 JoinPoint 实现幂等签名生成
java
@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 的"方法上下文"。只要你需要基于注解或参数做业务,就离不开它。