Spring AOP 中 JoinPoint 使用詳解
一、什么是 JoinPoint?
在 Spring AOP 中,JoinPoint 表示的是:
一個方法執(zhí)行的切入點(連接點),包含當前方法調(diào)用的全部運行時信息。
你可以把它理解成:
Spring AOP 告訴你:我要執(zhí)行這個方法了,你要不要看看它是誰?參數(shù)是什么?類是誰?用的是什么注解?
二、JoinPoint 能獲取哪些信息?
| 能獲取的內(nèi)容 | 使用方法 |
|---|---|
| 方法參數(shù) | joinPoint.getArgs() |
| 目標對象(真實類) | joinPoint.getTarget() |
| 代理對象(AOP 生成) | joinPoint.getThis() |
| 方法名 | joinPoint.getSignature().getName() |
| 類名 | joinPoint.getTarget().getClass() |
| 方法簽名 | MethodSignature |
| 方法本體 Method | ((MethodSignature) jp.getSignature()).getMethod() |
| 方法上的注解 | method.getAnnotation(XXX.class) |
這些能力構(gòu)成了 AOP 一切高級玩法:冪等、防重復提交、權(quán)限校驗、操作日志、審計…… 全靠 JoinPoint 取參數(shù)和注解。
三、獲取方法參數(shù)(最常用)
Object[] args = joinPoint.getArgs(); System.out.println(JSON.toJSONString(args));
輸出:
[{"name":"Tom","age":18}]
適用場景:
- 接口日志打印
- 冪等簽名(根據(jù)參數(shù)生成 Key)
- 參數(shù)校驗
- 審計記錄
四、獲取類名 + 方法名
String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); System.out.println(className + "." + methodName);
輸出:
com.demo.controller.UserController.createOrder
適用場景:
- 記錄接口訪問日志
- 記錄方法調(diào)用來源
- 記錄操作審計行為
五、獲取 Method 對象(獲取注解的必備步驟)
JoinPoint 獲取 Method 的正確方式:
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod();
拿到 Method 后你可以做什么?
六、獲取方法上的注解(非常常用)
在冪等、權(quán)限控制、操作日志等 AOP 場景中,你都會在方法上寫注解:
@PostMapping("/order/create")
@RepeatSubmit(interval = 5000)
public R createOrder(@RequestBody OrderDTO dto) {
return R.ok();
}
在 AOP 內(nèi)獲取注解:
RepeatSubmit repeatSubmit = method.getAnnotation(RepeatSubmit.class); int interval = repeatSubmit.interval();
這就是 AOP 注解驅(qū)動業(yè)務的核心。
七、完整示例:通過 JoinPoint 實現(xiàn)冪等簽名生成
@Before("@annotation(repeatSubmit)")
public void before(JoinPoint joinPoint, RepeatSubmit repeatSubmit) {
// 獲取 URI
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String uri = request.getRequestURI();
// 獲取參數(shù)
String params = JSON.toJSONString(joinPoint.getArgs());
// 獲取方法本體
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// 獲取注解內(nèi)容
RepeatSubmit anno = method.getAnnotation(RepeatSubmit.class);
long interval = anno.interval();
System.out.println("訪問接口:" + uri);
System.out.println("參數(shù):" + params);
System.out.println("注解配置間隔:" + interval + " ms");
}
輸出類似:

這就是 JoinPoint 在冪等邏輯中最常用的三件事:
- 獲取參數(shù)
- 獲取方法信息
- 獲取注解配置
八、JoinPoint 的典型應用場景
| 場景 | JoinPoint 的作用 |
|---|---|
| 防重復提交(冪等) | 獲取參數(shù) + 獲取注解配置 |
| 業(yè)務操作日志 | 獲取類名、方法名、參數(shù) |
| 統(tǒng)一異常記錄 | 獲取方法名、參數(shù) |
| 接口權(quán)限校驗 | 獲取注解權(quán)限標識 |
| 慢接口報警 | 方法計時 |
| 分布式鎖標識生成 | 參數(shù)簽名 |
說白了:
只要你需要知道“當前被調(diào)用的方法是哪個?參數(shù)是什么?注解是什么?”就必須用 JoinPoint。
九、總結(jié)
JoinPoint是 Spring AOP 中獲取方法運行時信息的核心接口- 它能獲取方法參數(shù)、類名、方法名、Method 對象、注解
- 是參數(shù)校驗、日志、冪等、防重復提交、權(quán)限控制等 AOP 功能的基礎(chǔ)
- 獲取注解必須先通過
MethodSignature得到 Method - 冪等、防重復提交中最常用的能力就是:
joinPoint.getArgs()+ 獲取注解配置
一句話總結(jié):
JoinPoint 是 AOP 的“方法上下文”。只要你需要基于注解或參數(shù)做業(yè)務,就離不開它。
到此這篇關(guān)于Spring AOP 中 JoinPoint 使用詳解的文章就介紹到這了,更多相關(guān)Spring AOP JoinPoint 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Dubbo Service Mesh基礎(chǔ)架構(gòu)組件改造
Service Mesh這個“熱”詞是2016年9月被“造”出來,而今年2018年更是被稱為service Mesh的關(guān)鍵之年,各家大公司都希望能在這個思潮下領(lǐng)先一步2023-03-03
使用Spring Data MongoDB進行地理位置相關(guān)查詢的步驟和示例
SpringData MongoDB是SpringData技術(shù)封裝了mongodb-driver技術(shù)之后的產(chǎn)物,它可以用更加簡單的方式操作MongoDB,本文給大家介紹了如何使用Spring Data MongoDB進行地理位置相關(guān)查詢的步驟和示例,需要的朋友可以參考下2025-05-05
Java Math類、Random類、System類及BigDecimal類用法示例
這篇文章主要介紹了Java Math類、Random類、System類及BigDecimal類用法,結(jié)合實例形式分析了java數(shù)值運算相關(guān)的Math類、Random類、System類及BigDecimal類基本功能與使用技巧,需要的朋友可以參考下2019-03-03
Spring Boot 整合原生 WebSocket的實際操作
文章介紹了WebSocket協(xié)議的基本概念、特點及在Spring Boot中的整合步驟,通過示例代碼和實際操作,展示了如何配置WebSocket處理器、握手攔截器、會話管理和服務類,感興趣的朋友跟隨小編一起看看吧2026-01-01
Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請求日志
這篇文章主要介紹了Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請求日志的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

