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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798480.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三参数陷波器

传统陷波器特性 传统陷波器的传递函数为: 传统陷波器的 Bode 图如图所示,根据图中曲线表明,当ξ 0.1、ξ 1、 ξ 10 时,随着ξ 值的增加,陷波宽度增大,陷波幅值也增大,此时,陷波…

线程安全(五)volatile 修饰共享变量(JIT即时编译器、指令重排序)

目录 一、volatile 简介1.1 定义1.2 volatile 的两个特性二、特性1:保证线程间的可见性示例1:普通场景1)代码示例:2)执行结果:3)总结:示例2:被 JIT 即时编译器优化1)代码示例:2)执行结果:3)原因分析:4)什么是 JIT 即时编译器?4)解决方案一:5)解决方案二:三…

三相PWM整流器PI双闭环控制Simulink

1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Rb)软件。建议采用matlab2017 Rb及以上版本打开。(若需要其他版本可联系代为转换) 2.拓扑结构: 3.模型算法架构: 4.仿真算法: &am…

Camunda如何通过外部任务与其他系统自动交互

文章目录 简介流程图外部系统pom.xmllogback.xml监听类 启动流程实例常见问题Public Key Retrieval is not allowed的解决方法java.lang.reflect.InaccessibleObjectException 流程图xml 简介 前面我们已经介绍了Camunda的基本操作、任务、表: Camunda组件与服务与…

OpenStack Yoga版安装笔记(六)glance练习

1、glance架构 Glance api处理来自用户端(OpenStackClient等)的请求,如果是读写镜像元数据,则对glance db进行读写操作,因为镜像元数据都保存在glance db里面;如果是存取镜像本身,则对后端存储…

Ubuntu系统上安装Apache和WordPress

** 第一步跟新系统包 ** 首先跟新系统包 sudo apt update sudo apt upgrade第二步下载安装apache sudo apt install apache2 ##查看apache的状态是否启动成功 sudo systemctl status apache2 ##查看服务器的ip地址 sudo ip a通过ip地址进行访问apache页面 第三步下载安装…

vue3+vite从零架构:写组件、构建、打包并上传个人前端组件库至私有npm仓库最终在自己项目中下载并使用(超详细的流程,小编已实现)

目录 第一章 前言 第二章 准备工作 第三章 封装组件 3.1 文件结构 3.2 编写组件代码 第四章 项目打包 第五章 发布到npm 5.1 npm准备工作 5.2 发布npm包 ​编辑 第六章 从npm安装使用 第一章 前言 在我们很多开发过程中,不管是使用vue还是react&#x…

github相关命令

如果我们要从 GitHub 上拉取一个项目到本地,进行修改并上传回去,通常需要以下步骤: 1. 克隆远程仓库到本地 使用 git clone 命令将 GitHub 上的项目克隆到本地: (网址示例如下所示) git clone https://github.com/你的…

DP- 使用最小花费爬楼梯 DAY19

使用最小花费爬楼梯 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。 …

STM32对flash中程序的加密保护

2024.7.14 今天学习了很多关于STM32对于程序的保护措施,原先一直不理解为什么DF CAR需要做加密,他的加密流程我也不是很知道,后面发现他是在控制任务初始化的时候,加了一个判断flash中某个区域的数值的程序,如果判断失…

易懂的吉文斯(Givens)变换(一)

文章目录 二阶Givens旋转矩阵作用于向量作用于矩阵更一般的情况 二阶Givens旋转矩阵 在QR分解中,Givens旋转是一种用于将矩阵变成上三角形的技术。 别的教程里面往往会直接给出一个n*n阶的通用Givens矩阵形式,但是这样太过抽象难懂了,而且难…

ceph 部署

端口号 NFS 2049 rpcbind 111 NFS 目录越深,写入性能越差 操作简单, 一.前言:存储知识 1、存储基础 单机存储设备 【1】DAS(直接附加存储,是直接接到计算机的主板总线上去的存储) IDE、SATA、SCSI、SAS…

记录些Redis题集(2)

Redis 的多路IO复用 多路I/O复用是一种同时监听多个文件描述符(如Socket)的状态变化,并能在某个文件描述符就绪时执行相应操作的技术。在Redis中,多路I/O复用技术主要用于处理客户端的连接请求和读写操作,以实现高并发…

《后端程序员 · Nacos 配置优先级动态刷新》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

J025_斗地主游戏案例开发(简版)

一、需求描述 完成斗地主游戏的案例开发。 业务:总共有54张牌; 点数:3、4、5、6、7、8、9、10、J、Q、K、A、2 花色:黑桃、红桃、方片、梅花 大小王:大王、小王 点数分别要组合4种花色,大小王各一张。…

mysql不初始化升级

1、下载mysql,下载地址:MySQL :: Download MySQL Community Server 2、解压下载好的mysql,修改配置文件的datadir指定目录为当前数据存储的目录 3、通过管理员cmd进入新版本mysql的bin目录, 然后执行命令安装mysql服务&#xff…

性能测试(2)

jmeter参数化 loadrunner Jmeter IP欺骗,也称为IP欺诈,是指通过伪装、篡改IP地址的方式,进行网络攻击或欺骗行为。这种行为可能会导致网络安全问题,包括身份盗窃、数据泄露、DDoS攻击等。为了保护自己的网络安全,用户…

「C++系列」一篇文章讲透【运算符】

文章目录 一、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 条件运算符(三元运算符)7. 成员访问运算符8. 指针和地址运算符9. 类型转换运算符10. 其他运算符 二、其他特殊运算符1. 成员访问运算符2. 指针和地址运算符3. 类…

C语言 ——— 模拟实现strcpy函数

目录 strcpy函数功能介绍 strcpy函数的模拟实现 strcpy函数功能介绍 学习并使用strcpy函数-CSDN博客 strcpy函数的模拟实现 代码演示&#xff1a; #include<stdio.h> #include<assert.h> char* my_strcpy(char* destination, const char* source) {assert(des…

OpenCV下的单目标定,双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify)

OpenCV下的单目标定&#xff0c;双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify) 文章目录 1. 杂话2. 单目标定2.1 先看代码2.2 一点解释2.3 calibrateCamera参数 3. 双目标定3.1 先看代码3.2 stereoCalibrate参数 4. 立体校正4.1 先看代码4.2 一点解…