Spring AOP 中 JoinPoint 使用指南

文章目录

  • [一、什么是 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 在幂等逻辑中最常用的三件事:

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

八、JoinPoint 的典型应用场景

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

说白了:

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


九、总结

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

一句话总结:

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

相关推荐
Coinsheep4 小时前
SSTI-flask靶场搭建及通关
python·flask·ssti
IT实战课堂小元酱4 小时前
大数据深度学习|计算机毕设项目|计算机毕设答辩|flask露天矿爆破效果分析系统开发及应用
人工智能·python·flask
码农阿豪4 小时前
Flask应用上下文问题解析与解决方案:从错误日志到完美修复
后端·python·flask
wqq63108554 小时前
Python基于Vue的实验室管理系统 django flask pycharm
vue.js·python·django
Q_Q19632884754 小时前
python大学生爱心校园互助代购网站_nyvlx_django Flask vue pycharm项目
python·django·flask
码农阿豪4 小时前
Python Flask应用中文件处理与异常处理的实践指南
开发语言·python·flask
岁岁种桃花儿4 小时前
CentOS7 彻底卸载所有JDK/JRE + 重新安装JDK8(实操完整版,解决kafka/jps报错)
java·开发语言·kafka
xcLeigh4 小时前
Python 项目实战:用 Flask 实现 MySQL 数据库增删改查 API
数据库·python·mysql·flask·教程·python3
威迪斯特4 小时前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
一灰灰blog5 小时前
Spring AI中的多轮对话艺术:让大模型主动提问获取明确需求
数据库·人工智能·spring