Spring AOP 實現 Excel 導出統一處理

你好,我是柳岸花開。在實際開發中,經常會遇到需要導出 Excel 數據的需求。為了避免代碼重復,我們可以使用 Spring AOP(面向切面編程)來實現 Excel 導出的統一處理。本文將介紹如何使用 Spring AOP 在項目中統一處理 Excel 導出的操作,減少重復代碼的編寫。

  1. 引言

Excel 導出是許多項目中常見的功能,但每次都編寫導出邏輯會導致代碼重復,降低開發效率。通過 Spring AOP,我們可以將導出邏輯進行統一處理,提高代碼的可維護性和可重用性。

  1. ExcelResponseAspect 類

下面是一個使用 Spring AOP 實現的 Excel 導出統一處理類 ExcelResponseAspect。該類使用了注解 @ExcelResponse 來標記需要進行 Excel 導出的方法,然后根據注解的配置來處理導出邏輯。 // ...(省略導入包和類定義)

? @Aspect @Component @Slf4j public class ExcelResponseAspect { ? @Pointcut("@annotation(com.uc.common.excel.annotations.ExcelResponse)") public void arroundHandlerPoinCut() { } ? @Around(value = "arroundHandlerPoinCut()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); ExcelResponse excelResponse = method.getAnnotation(ExcelResponse.class); ? // 獲取方法參數 Object[] args = pjp.getArgs(); Object target = args[0]; ? // 根據注解配置判斷是否導出 Excel if (StringUtils.isNotBlank(excelResponse.determineExportName())) { Object exportExcel = BeanUtil.getFieldValue(target, excelResponse.determineExportName()); if (!Boolean.valueOf(String.valueOf(exportExcel))) { return pjp.proceed(); } } ? // 如果有分頁參數,設置記錄數為最大 if (StringUtils.isNotBlank(excelResponse.pageSizeName())) { BeanUtil.setFieldValue(target, excelResponse.pageSizeName(), Integer.MAX_VALUE); } ? Object result = null; try { result = pjp.proceed(); String fileName = URLEncoder.encode(excelResponse.fileName(), "UTF-8").replaceAll("\+", "%20"); HttpServletResponse response = genResponse(fileName); ? MethodReturnValueHandler methodReturnValueHandler = excelResponse.methodReturnValueHandler().newInstance(); EasyExcel.write(response.getOutputStream(), methodReturnValueHandler.getHeaderClass()) .autoCloseStream(Boolean.FALSE) .sheet(excelResponse.sheetName()) .doWrite(methodReturnValueHandler.exactList(result)); ? response.getOutputStream().flush(); } catch (Throwable e) { log.error("請求異常, method: {} ", method.getName(), e); } return null; } ? // ...(省略方法) ? public interface MethodReturnValueHandler { Class getHeaderClass(); Collection exactList(Object result); } } ? 3. 使用 ExcelResponse 注解

要使用 ExcelResponse 注解來標記需要導出 Excel 的方法,需要在方法上添加 @ExcelResponse 注解,并配置相關屬性。下面是一個示例: @ExcelResponse(fileName = "user_data", sheetName = "User Data") public List exportUserData(UserQuery userQuery) { List userList = userService.getUserList(userQuery); return userList; } ? 在這個示例中,@ExcelResponse 注解標記了一個導出用戶數據的方法,指定了 Excel 文件名為 "user_data",工作表名稱為 "User Data"。

  1. 總結 通過使用 Spring AOP 和 ExcelResponseAspect 類,我們可以實現 Excel 導出的統一處理,將導出邏輯與業務邏輯分離,提高了代碼的可維護性和可重用性。這對于需要頻繁進行 Excel 導出的項目來說,是一個非常有用的技術。希望本文能夠幫助你更好地理解 Spring AOP 和 Excel 導出的結合應用。

👇關注我,下期了解👇 ? SpringMVC源碼 ? ? alt ? ? 回復 222,獲取Java面試題合集 ? 關于我 ? 一枚愛折騰的Java程序猿,專注Spring干貨。把路上的問題記錄下來,幫助那些和我一樣的人。 ? 好奇心強,喜歡并深入研究古天文。 ? 崇尚 個人系統創建,做一些時間越長越有價值的事情。思考 把時間留下來 又 每刻都是新的。

本文由 mdnice 多平臺發布

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

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

相關文章

【學習筆記】無人機(UAV)在3GPP系統中的增強支持(十三)-更換無人機控制器

引言 本文是3GPP TR 22.829 V17.1.0技術報告,專注于無人機(UAV)在3GPP系統中的增強支持。文章提出了多個無人機應用場景,分析了相應的能力要求,并建議了新的服務級別要求和關鍵性能指標(KPIs)。…

枚舉的高階用法之枚舉里寫方法以及注入spring的bean

1、前言 一般我們使用枚舉都是用來定義一些常量。比如我們需要一個表示訂單類(pc訂單、手機訂單)的常量,那我們就可以使用枚舉來實現,如下: AllArgsConstructor public enum OrderTypeEnum{PC("PC", "電腦端"),PHONE("PHONE", "手機端&quo…

[計網初識2]web的3個核心標準html,url,http

學習內容 HTML,URL,HTTP的構成 1.規范web的3個核心標準? HTML(Hyper Text Markup Language),規范網頁內容和版面布局的表示標準。URL(Uniform Resource Locator),規范網頁識別符格式和含義的表示標準。HTTP(HyperText Transfer Protocl),規范游覽器如…

JIRA的高級搜索JIRA Query Language(JQL)詳解

JIRA的高級搜索功能非常強大,允許用戶通過JIRA Query Language(JQL)來構建復雜的查詢。以下是一些常用的高級搜索用法和示例: 1. 基本語法 JQL的基本語法包括字段、運算符和值的組合。例如: field operator value2.…

<數據集>UA-DETRAC車輛識別數據集<目標檢測>

數據集格式:VOCYOLO格式 圖片數量:20500張 標注數量(xml文件個數):20500 標注數量(txt文件個數):20500 標注類別數:4 標注類別名稱:[car, van, others, bus] 序號類別名稱圖片數框數1car201871259342…

鋇錸ARMxy控制器在智能網關中的應用

隨著IoT物聯網技術的飛速發展,智能網關作為連接感知層與網絡層的樞紐,可以實現感知網絡和通信網絡以及不同類型感知網絡之間的協議轉換。鋇錸技術的ARMxy系列控制器憑借其高性能、低功耗和高度靈活性的特點,在智能網關中發揮了關鍵作用&#…

數據結構回顧(Java)

1.數組 線性表 定義的方式 int[] anew int[10] 為什么查詢快? 1.可以借助O(1)時間復雜度訪問某一元素, 2.地址連續,邏輯連續 3.數組長度一旦確定就不可以被修改 當需要擴容的時候需要將老數組的內容復制過來 在Java中數組是一個對象 Ar…

bug定位策略

前提--用戶環境層面 hosts異常:hosts文件主要是加快某個域名或者網站的解析速度,從而達到快速訪問的作用,也可以屏蔽網站。hosts異常可能會導致部分網頁無法訪問,能夠加載,但是網頁無法正常顯示;測試環境臟…

記錄些Redis題集(2)

Redis 的多路IO復用 多路I/O復用是一種同時監聽多個文件描述符(如Socket)的狀態變化,并能在某個文件描述符就緒時執行相應操作的技術。在Redis中,多路I/O復用技術主要用于處理客戶端的連接請求和讀寫操作,以實現高并發…

Python_使用pyecharts構建折線圖

Pyecharts簡介 Pyecharts是一款將python與echarts結合的強大的數據可視化工具,使用 pyecharts 可以生成獨立的網頁,也可以在 flask , Django 中集成使用。echarts :百度開源的一個數據可視化 JS 庫,主要用于數據可視化。pyechart…

嵌入式linux相機 框圖

攝像頭讀取數據顯示到LCD流程 重點:攝像頭數據(yuyv,mjpeg,rgb)(640,320)與LCD顯示數據(RGB)(480,240)不同;需要轉換&…

ReactRouter v6升級的步驟

React Router v6 引入了一個 Routes 組件&#xff0c;它有點像 Switch &#xff0c;但功能要強大得多。與 Switch 相比&#xff0c; Routes 的主要優勢在于&#xff1a; <Routes> 中的所有 <Route> 和 <Link> 都是相對的。這導致在 <Route path> 和 &…

項目文章|EMBO J(IF=9.4):16S+代謝組解析腸道菌群代謝物改善高脂飲食誘導的胰島素抵抗機制

腸道菌群及其代謝產物與肥胖相關疾病&#xff08;如2型糖尿病&#xff09;密切相關&#xff0c;但其因果關系和潛在機制尚不清楚。研究表明&#xff0c;肥胖與腸道微生物的豐度和多樣性變化有關&#xff0c;例如&#xff0c;高脂飲食&#xff08;HFD&#xff09;誘導的肥胖會增…

AIGC率超標?掌握論文去AI痕跡的高效策略

隨著 AI 技術迅猛發展&#xff0c;各種AI輔助論文寫作的工具層出不窮&#xff01; 為了防止有人利用AI工具進行論文代寫&#xff0c;在最新的學位法中已經明確規定“已經獲得學位者&#xff0c;在獲得該學位過程中如有人工智能代寫等學術不端行為&#xff0c;經學位評定委員會…

ESP32CAM物聯網教學11

ESP32CAM物聯網教學11 霍霍webserver 在第八課的時候&#xff0c;小智把樂鑫公司提供的官方示例程序CameraWebServer改成了明碼&#xff0c;這樣說明這個官方程序也是可以更改的嘛。這個官方程序有四個文件&#xff0c;一共3500行代碼&#xff0c;看著都頭暈&#xff0c;小智決…

S7-200smart與C#通信

https://www.cnblogs.com/heizao/p/15797382.html C#與PLC通信開發之西門子s7-200 smart_c# s7-200smart通訊庫-CSDN博客https://blog.csdn.net/weixin_44455060/article/details/109713121 C#上位機讀寫西門子S7-200SMART PLC變量 教程_嗶哩嗶哩_bilibilihttps://www.bilibili…

清朝嘉慶二十五年(1820年)地圖數據

我們在《中國歷史行政區劃連續變化數據》一文中&#xff0c;為你分享了中國歷史行政區劃連續變化地圖數據。 現在再為你分享清朝嘉慶二十五年&#xff08;1820年&#xff09;的地圖數據&#xff0c;該數據對于研究歷史的朋友應該比較有用&#xff0c;請在文末查看領取方式。 …

【Rust練習】2.數值類型

練習題來自https://practice-zh.course.rs/basic-types/numbers.html 1 // 移除某個部分讓代碼工作 fn main() {let x: i32 5;let mut y: u32 5;y x;let z 10; // 這里 z 的類型是? }y的類型不對&#xff0c;另外&#xff0c;數字的默認類型是i32 fn main() {let x: i…

Jupyter Lab 使用

Jupyter Lab 使用詳解 Jupyter Lab 是一個基于 Web 的交互式開發環境&#xff0c;提供了比 Jupyter Notebook 更加靈活和強大的用戶界面和功能。以下是使用 Jupyter Lab 的詳細指南&#xff0c;包括安裝、基本使用、設置根目錄和擴展功能等內容。 一、Jupyter Lab 安裝與啟動…

HTTP背后的故事:理解現代網絡如何工作的關鍵(一)

一.HTTP是什么 概念 &#xff1a; 1.HTTP ( 全稱為 " 超文本傳輸協議 ") 是一種應用非常廣泛的 應用層協議。 2.HTTP 誕生與1991年. 目前已經發展為最主流使用的一種應用層協議. 3.HTTP 往往是基于傳輸層的 TCP 協議實現的 . (HTTP1.0, HTTP1.1, HTTP2.0 均為 T…