Spring 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 取参数和注解。
三、获取方法参数(最常用)
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 使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
浅析Java中print、printf、println的区别
以下是对Java中print、printf、println的区别进行了详细的分析介绍,需要的朋友可以过来参考下2013-08-08
mybatis generator 配置 反向生成Entity简单增删改查(推荐)
这篇文章主要介绍了mybatis generator 配置 反向生成Entity简单增删改查(推荐)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下2016-12-12
spring @Cacheable扩展实现缓存自动过期时间及自动刷新功能
用过spring cache的朋友应该会知道,Spring Cache默认是不支持在@Cacheable上添加过期时间的,虽然可以通过配置缓存容器时统一指定,本文主要介绍了如何基于spring @Cacheable扩展实现缓存自动过期时间以及缓存即将到期自动刷新,2024-02-02


最新评论