Spring AOP中為所有類型通知傳遞參數的完整示例,包含詳細注釋和參數傳遞方式

以下是Spring AOP中為所有類型通知傳遞參數的完整示例,包含詳細注釋和參數傳遞方式:

// 1. 目標類(被增強的類)
package com.example;public class TargetService {public void doTask(String param) {System.out.println("執行業務邏輯,參數:" + param);}public void doTaskWithoutParam() {System.out.println("執行無參業務邏輯");}public void doTaskWithError() throws Exception {System.out.println("執行會拋異常的邏輯");throw new RuntimeException("模擬異常");}
}
// 2. 切面類(包含所有通知類型)
package com.example;import org.aspectj.lang.*;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Aspect
@Component
public class ParameterAspect {// 前置通知:通過JoinPoint獲取參數@Before("execution(* com.example.TargetService.*(..))")public void beforeAdvice(JoinPoint joinPoint) {System.out.println("前置通知:方法開始");Object[] args = joinPoint.getArgs();for (Object arg : args) {System.out.println("參數值:" + arg);}}// 后置通知:返回值和參數@AfterReturning(pointcut = "execution(* com.example.TargetService.*(..))",returning = "result")public void afterReturningAdvice(JoinPoint joinPoint, Object result) {System.out.println("后置通知:方法正常返回");System.out.println("返回值:" + result);System.out.println("參數列表:" + joinPoint.getArgs());}// 異常通知:捕獲異常和參數@AfterThrowing(pointcut = "execution(* com.example.TargetService.*(..))",throwing = "ex")public void afterThrowingAdvice(JoinPoint joinPoint, Throwable ex) {System.out.println("異常通知:方法拋出異常");System.out.println("異常信息:" + ex.getMessage());System.out.println("異常發生時的參數:" + joinPoint.getArgs());}// 環繞通知:直接操作ProceedingJoinPoint@Around("execution(* com.example.TargetService.*(..))")public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {System.out.println("環繞通知:方法執行前");System.out.println("方法參數:" + pjp.getArgs());try {Object result = pjp.proceed();System.out.println("環繞通知:方法執行后");return result;} catch (Throwable ex) {System.out.println("環繞通知:捕獲異常");throw ex;}}// 引介通知:不直接傳遞參數(示例展示引入接口)@DeclareParents(value = "com.example.TargetService+",defaultImpl = AuditLogImpl.class)private AuditLog auditLog;private static class AuditLogImpl implements AuditLog {@Overridepublic void log() {System.out.println("引介通知:記錄審計日志");}}
}
// 3. Spring配置類
package com.example;import org.springframework.context.annotation.*;@Configuration
@ComponentScan("com.example")
@EnableAspectJAutoProxy
public class AppConfig {@Beanpublic TargetService targetService() {return new TargetService();}
}
// 4. 測試類
public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);TargetService service = context.getBean(TargetService.class);// 測試正常流程service.doTask("參數1");// 測試無參方法service.doTaskWithoutParam();// 測試異常流程try {service.doTaskWithError();} catch (Exception e) {System.out.println("捕獲到異常:" + e.getMessage());}// 測試引介接口AuditLog audit = (AuditLog) service;audit.log();}
}

關鍵點總結表格

通知類型參數傳遞方式示例代碼片段參數來源說明
前置通知JoinPoint.getArgs()Object[] args = joinPoint.getArgs();直接獲取方法參數數組
后置通知JoinPoint + 返回值參數public void afterReturningAdvice(JoinPoint joinPoint, Object result)返回值通過returning參數獲取
異常通知JoinPoint + 異常參數public void afterThrowingAdvice(JoinPoint joinPoint, Throwable ex)異常對象通過throwing參數獲取
環繞通知ProceedingJoinPointpjp.proceed()包含完整方法控制權
引介通知不直接傳遞參數(接口綁定)@DeclareParents通過接口實現間接關聯

執行結果

前置通知:方法開始
參數值:參數1
環繞通知:方法執行前
方法參數:[參數1]
執行業務邏輯,參數:參數1
環繞通知:方法執行后
后置通知:方法正常返回
返回值:null
參數列表:[參數1]前置通知:方法開始
環繞通知:方法執行前
方法參數:[]
執行無參業務邏輯
環繞通知:方法執行后
后置通知:方法正常返回
返回值:null
參數列表:[]前置通知:方法開始
環繞通知:方法執行前
方法參數:[]
執行會拋異常的邏輯
異常通知:方法拋出異常
異常信息:模擬異常
異常發生時的參數:[]
環繞通知:捕獲異常
捕獲到異常:模擬異常引介通知:記錄審計日志

核心要點

  1. JoinPoint:所有通知(除環繞)都通過JoinPoint對象獲取參數
  2. ProceedingJoinPoint:環繞通知特有的接口,支持手動執行目標方法
  3. 參數綁定:通過注解屬性(如returning/throwing)聲明額外參數
  4. 參數類型:參數類型需與目標方法參數匹配,可通過joinPoint.getSignature()獲取方法元數據
  5. 引介通知:主要用于類型增強,不直接參與參數傳遞

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74163.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74163.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74163.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Git教程】將dev分支合并到master后,那么dev分支該如何處理

將 dev 合并到 master 后的分支狀態與操作指南 1. 合并后的分支狀態 dev 分支不會消失: Git 的 git merge 命令僅將 dev 的內容合并到 master,不會刪除 dev 分支。合并后,dev 分支仍然存在,其歷史記錄和代碼保持不變。 分支的 H…

【go】異常處理panic和recover

panic 和 recover 當然能觸發程序宕機退出的,也可以是我們自己,比如經過檢查判斷,當前環境無法達到我們程序進行的預期條件時(比如一個服務指定監聽端口被其他程序占用),可以手動觸發 panic,讓…

CSS層疊順序

介紹 在 CSS 中,元素的層疊順序決定了當多個元素重疊時(跟布局沒有完全的關系,也就是說層疊順序只會在幾個疊放元素上進行比較,而不會改變布局),哪個元素顯示在最上面,哪個元素顯示在最下面。 …

數制——FPGA

1、定點數 定點數的三種表示方式: 原碼:符號位 絕對值 表示方法 反碼:正數的反碼表示 與原碼表示一致,負數的反碼表示 除符號位,其他位全都取反 補碼:正數的補碼表示 與原碼表示一致,負數的補碼…

在用redis當中可能遇到的問題解決方案以及redis中的一些名詞解釋

在用redis當中可能遇到的問題解決方案以及redis中的一些名詞解釋 Redis篇一、緩存穿透:解決方案:緩存空數據布隆過濾器 二、緩存擊穿解決方案互斥鎖,強一致性,性能差,速度慢邏輯過期,數據不同步&#xff0c…

一文詳解QT環境搭建:Windows使用CLion配置QT開發環境

在當今的軟件開發領域,跨平臺應用的需求日益增長,Qt作為一款流行的C圖形用戶界面庫,因其強大的功能和易用性而備受開發者青睞。與此同時,CLion作為一款專為C/C打造的強大IDE,提供了豐富的特性和高效的編碼體驗。本文將…

【區塊鏈安全 | 第二十四篇】單位和全局可用變量(二)

文章目錄 單位和全局可用變量(Units and Globally Available Variables)特殊變量和函數1. 區塊和交易屬性2. ABI 編碼和解碼函數3. bytes 成員函數4. string 成員函數5. 錯誤處理6. 數學和加密函數7. 地址類型成員函數8. 與合約相關9. 類型信息 單位和全…

一種監控錄像視頻恢復的高效解決方案,從每一幀中尋找可能性

該軟件旨在恢復從監控設備中刪除或丟失的視頻。該程序經過調整以處理大多數流行供應商的閉路電視系統中使用的專有格式,并通過智能重建引擎進行了增強,能夠為監控記錄提供任何通用解決方案都無法實現的恢復結果。如果不需要持續使用該軟件,則…

網紅指路機器人是否支持環境監測功能?

嘿呀,你可知道?如今的叁仟網紅指路機器人那可太牛啦!它們可不單單局限于為行人指明方向,還紛紛兼職當起了 “環境小衛士”,為咱們的城市生活注入了前所未有的超智能便利。就拿那個依托叁仟智慧桿打造的數智指路機器人來…

Navicat導出mysql數據庫表結構說明到excel、word,單表導出方式記錄

目前只找到一張一張表導出的方式 使用information_schema傳入表名查詢 字段名根據需要自行刪減,一般保留序號、字段名、類型、說明就行 SELECT COLUMNS.ORDINAL_POSITION AS 序號, COLUMNS.COLUMN_NAME AS 字段名, COLUMNS.COLUMN_TYPE AS 類型(長度), COLUMNS.N…

MySQL主從數據庫搭建

此方案可適用于Centos 7、OpenEuler、Ubuntu操作系統。 在國產銀河麒麟V10中,虛擬機中啟動的麒麟系統使用當前方案并未遇到問題,但是在服務器上安裝時,執行到初始化時出現了找不到依賴問題(目前已解決安裝問題),后續我會繼續更新該問題解決方案。 1. 創建主、從安裝目錄…

`git commit --amend` 詳解:修改提交記錄的正確方式

文章目錄 git commit --amend 詳解:修改提交記錄的正確方式1. 修改提交信息2. 補充遺漏的文件3. 結合 --amend 進行交互式修改4. 已推送提交的修改總結 git commit --amend 詳解:修改提交記錄的正確方式 git commit --amend 用于修改最近一次的提交&…

為什么package.json里的npm和npm -v版本不一致?

這個情況出現是因為package.json里的 npm 版本和系統實際使用的 npm 版本是兩個不同的概念。讓我來解釋一下: 原因解釋 全局 npm vs 項目依賴: npm -v顯示的是系統全局安裝的 npm 版本(位于/usr/bin/npm或類似路徑)package.jso…

python系統之綜合案例:用python打造智能詩詞生成助手

不為失敗找理由,只為成功找方法。所有的不甘,因為還心存夢想,所以在你放棄之前,好好拼一把,只怕心老,不怕路長。 python系列之綜合案例 前言一、項目描述二、項目需求三、 項目實現1、開發準備2、代碼實現 …

Java常用工具算法-1--哈希算法(MD5,SHA家族,SHA-256,BLAKE2)

1、概述 哈希算法(Hash Algorithm),又稱散列算法,是一種將任意長度的輸入數據(明文)轉換為固定長度的輸出(哈希值/摘要)的數學算法。 哈希值通常被稱為摘要(Digest&…

OpenMCU(五):STM32F103時鐘樹初始化分析

概述 本文主要描述了STM32F103初始化過程系統時鐘的初始化,主要描述了系統時鐘的初始化,AHB總線時鐘,APB總線時鐘等的初始化。 硬件板卡3d圖 時鐘樹 STM32F103的時鐘樹,如下所示: 時鐘源選擇 從STM32F103的時鐘樹框圖,我們可以…

【qt】文件類(QFile)

很高興你能看到這篇文章,同時我的語雀文檔也更新了許多嵌入式系列的學習筆記希望能幫到你 : https://www.yuque.com/alive-m4b9n 目錄 QFile 主要功能QFile 操作步驟QFile 其他常用函數案例分析及實現功能一實現:打開文件并顯示功能二實現:另…

基于AT89C52單片機的輪胎壓力監測系統

點擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/90545655?spm1001.2014.3001.5503 功能介紹: 采用MPX4115壓力傳感器進行輪胎壓力檢測;使用LCD液晶顯示器顯示輪胎壓力;若壓力過…

shell腳本--MySQL簡單調用

實現功能 增 數據庫的創建,數據表的創建已經實現 創建用戶 刪 刪除數據庫, 刪除庫下的某個表, 刪除某個用戶 改 暫無 查 查看所有的數據庫, 查看某個庫下的所有數據表, 查看某個表的結構, 查…

計算機網絡 OSI參考模型

目錄 OSS七層 OSI通信過程1 OSI通信過程2 應用層 表示層 會話層 傳輸層 網絡層 數據鏈路層 物理層 OSS七層 OSI通信過程1 OSI通信過程2 應用層 表示層 會話層 傳輸層 網絡層 數據鏈路層 物理層