你好,我是柳岸花開。在實際開發中,經常會遇到需要導出 Excel 數據的需求。為了避免代碼重復,我們可以使用 Spring AOP(面向切面編程)來實現 Excel 導出的統一處理。本文將介紹如何使用 Spring AOP 在項目中統一處理 Excel 導出的操作,減少重復代碼的編寫。
-
引言
Excel 導出是許多項目中常見的功能,但每次都編寫導出邏輯會導致代碼重復,降低開發效率。通過 Spring AOP,我們可以將導出邏輯進行統一處理,提高代碼的可維護性和可重用性。
-
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"。
-
總結 通過使用 Spring AOP 和 ExcelResponseAspect 類,我們可以實現 Excel 導出的統一處理,將導出邏輯與業務邏輯分離,提高了代碼的可維護性和可重用性。這對于需要頻繁進行 Excel 導出的項目來說,是一個非常有用的技術。希望本文能夠幫助你更好地理解 Spring AOP 和 Excel 導出的結合應用。
👇關注我,下期了解👇 ? SpringMVC源碼 ? ? ? ? 回復 222,獲取Java面試題合集 ? 關于我 ? 一枚愛折騰的Java程序猿,專注Spring干貨。把路上的問題記錄下來,幫助那些和我一樣的人。 ? 好奇心強,喜歡并深入研究古天文。 ? 崇尚 個人系統創建,做一些時間越長越有價值的事情。思考 把時間留下來 又 每刻都是新的。
本文由 mdnice 多平臺發布