Spring AOP 中 JoinPoint 使用详解

 更新时间:2026年02月11日 09:35:03   作者:Knight_AL  
JoinPoint是Spring AOP中获取方法运行时信息的核心接口,可以获取方法参数、类名、方法名、Method对象、注解等,下面就来介绍一下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 在幂等逻辑中最常用的三件事:

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

八、JoinPoint 的典型应用场景

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

说白了:

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

九、总结

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

一句话总结:

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

到此这篇关于Spring AOP 中 JoinPoint 使用详解的文章就介绍到这了,更多相关Spring AOP  JoinPoint 使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Dubbo Service Mesh基础架构组件改造

    Dubbo Service Mesh基础架构组件改造

    Service Mesh这个“热”词是2016年9月被“造”出来,而今年2018年更是被称为service Mesh的关键之年,各家大公司都希望能在这个思潮下领先一步
    2023-03-03
  • java中hibernate二级缓存详解

    java中hibernate二级缓存详解

    本篇文章中主要介绍了java中hibernate二级缓存详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 使用Spring Data MongoDB进行地理位置相关查询的步骤和示例

    使用Spring Data MongoDB进行地理位置相关查询的步骤和示例

    SpringData MongoDB是SpringData技术封装了mongodb-driver技术之后的产物,它可以用更加简单的方式操作MongoDB,本文给大家介绍了如何使用Spring Data MongoDB进行地理位置相关查询的步骤和示例,需要的朋友可以参考下
    2025-05-05
  • Java Math类、Random类、System类及BigDecimal类用法示例

    Java Math类、Random类、System类及BigDecimal类用法示例

    这篇文章主要介绍了Java Math类、Random类、System类及BigDecimal类用法,结合实例形式分析了java数值运算相关的Math类、Random类、System类及BigDecimal类基本功能与使用技巧,需要的朋友可以参考下
    2019-03-03
  • java String 可变性的分析

    java String 可变性的分析

    这篇文章主要介绍了java String 可变性的分析的相关资料,通常大家都认为java String 是不可变的,这里分析下源码来说明它的可变性,需要的朋友可以参考下
    2017-03-03
  • Java利用遗传算法求解最短路径问题

    Java利用遗传算法求解最短路径问题

    遗传算法(Genetic Algorithm,GA)最早是由美国的John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。本文将利用遗传算法求解最短路径问题,需要的可以参考一下
    2022-06-06
  • mybatis plus常用注解的具体使用

    mybatis plus常用注解的具体使用

    本文主要介绍了mybatis plus常用注解的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Spring Boot 整合原生 WebSocket的实际操作

    Spring Boot 整合原生 WebSocket的实际操作

    文章介绍了WebSocket协议的基本概念、特点及在Spring Boot中的整合步骤,通过示例代码和实际操作,展示了如何配置WebSocket处理器、握手拦截器、会话管理和服务类,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • CentOS8.2安装Java 14.0.2的教程详解

    CentOS8.2安装Java 14.0.2的教程详解

    这篇文章主要介绍了CentOS8.2安装Java 14.0.2的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Spring Cloud gateway 网关如何拦截Post请求日志

    Spring Cloud gateway 网关如何拦截Post请求日志

    这篇文章主要介绍了Spring Cloud gateway 网关如何拦截Post请求日志的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论