外卖项目:使用AOP切面编程实现增删改查的操作日志记录(debug断点调试)

文章目录

  • 一、问题描述
  • 二、问题分析
  • 三、断掉调试
  • 四、代码展示

一、问题描述

需求:将项目中增、删、改相关接口的操作日志记录到数据库表中。

操作日志信息包含:

  • 操作人、操作时间、执行方法的全类名、执行方法名、方法运行时参数、返回值、方法执行时长

所记录的日志信息包括当前接口的操作人是谁操作的,什么时间点操作的,以及访问的是哪个类当中的哪个方法,在访问这个方法的时候传入进来的参数是什么,访问这个方法最终拿到的返回值是什么,以及整个接口方法的运行时长是多长时间。

二、问题分析

问题1:项目当中增删改相关的方法是不是有很多?

问题2:我们需要针对每一个功能接口方法进行修改,在每一个功能接口当中都来记录这些操作日志吗?

以上两个问题的解决方案:可以使用AOP解决(每一个增删改功能接口中要实现的记录操作日志的逻辑代码是相同)。

可以把这部分记录操作日志的通用的、重复性的逻辑代码抽取出来定义在一个通知方法当中,我们通过AOP面向切面编程的方式,在不改动原始功能的基础上来对原始的功能进行增强。目前我们所增强的功能就是来记录操作日志,所以也可以使用AOP的技术来实现。使用AOP的技术来实现也是最为简单,最为方便的。

问题3:既然要基于AOP面向切面编程的方式来完成的功能,那么我们要使用 AOP五种通知类型当中的哪种通知类型?

  • 答案:环绕通知

所记录的操作日志当中包括:操作人、操作时间,访问的是哪个类、哪个方法、方法运行时参数、方法的返回值、方法的运行时长。

方法返回值,是在原始方法执行后才能获取到的。

方法的运行时长,需要原始方法运行之前记录开始时间,原始方法运行之后记录结束时间。通过计算获得方法的执行耗时。

基于以上的分析我们确定要使用Around环绕通知。

问题4:最后一个问题,切入点表达式我们该怎么写?

  • 答案:使用annotation来描述表达式

要匹配业务接口当中所有的增删改的方法,而增删改方法在命名上没有共同的前缀或后缀。此时如果使用execution切入点表达式也可以,但是会比较繁琐。 当遇到增删改的方法名没有规律时,就可以使用 annotation切入点表达式

三、断掉调试

让我们用debug来看一下,先来看看修改相关的操作:
在这里插入图片描述在这里插入图片描述放行断点
在这里插入图片描述在这里插入图片描述在这里插入图片描述

通过debug,看控制台的operateLog对面都注入成功
在这里插入图片描述
我们来看看数据库:

在这里插入图片描述
最后来看看查询时的情况:

在这里插入图片描述在这里插入图片描述在这里插入图片描述最后来看看数据库:

在这里插入图片描述

四、代码展示

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OperationLog {
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class OperateLog {private Long id; //主键IDprivate Long operateUser; //操作人IDprivate LocalDateTime operateTime; //操作时间private String className; //操作类名private String methodName; //操作方法名private String methodParams; //操作方法参数private String returnValue; //操作方法返回值private Long costTime; //操作耗时
}
CREATE TABLE `operate_log` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`operate_user` bigint unsigned DEFAULT NULL COMMENT '操作人ID',`operate_time` datetime DEFAULT NULL COMMENT '操作时间',`class_name` varchar(100) DEFAULT NULL COMMENT '操作的类名',`method_name` varchar(100) DEFAULT NULL COMMENT '操作的方法名',`method_params` varchar(1000) DEFAULT NULL COMMENT '方法参数',`return_value` varchar(2000) DEFAULT NULL COMMENT '返回值',`cost_time` bigint DEFAULT NULL COMMENT '方法执行耗时, 单位:ms',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='操作日志表'
@Component
@Aspect
@Slf4j
public class OperationAspect {@Autowiredprivate OperateLogMapper operateLogMapper;@Around("@annotation(com.sky.annotation.OperationLog)")public Object log(ProceedingJoinPoint joinPoint) {try {Long operateUser = BaseContext.getCurrentId();//操作人IDLocalDateTime now = LocalDateTime.now();//操作时间long begin = System.currentTimeMillis();//开始时间String className = joinPoint.getTarget().getClass().getName();//操作类名String methodName = joinPoint.getSignature().getName();//操作方法名Object[] args = joinPoint.getArgs();String methodParams = Arrays.toString(args);//操作方法参数Object result = joinPoint.proceed();//调用原始目标方法运行long end = System.currentTimeMillis();String returnValue = JSONObject.toJSONString(result);//方法返回值long costTime = end - begin;//操作耗时OperateLog operateLog =new OperateLog(null, operateUser, now, className, methodName, methodParams, returnValue, costTime);operateLogMapper.insert(operateLog);return result;} catch (Throwable e) {throw new RuntimeException(e);}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC实现部署到局域网

前面已经实现了一对一视频、一对多视频和一对多虚拟视频,所以,这节就来试试把前面做好的项目部署到局域网上,边学边用才能让自己干劲十足。 粉丝福利, 免费领取C音视频学习资料包学习路线大纲、技术视频/代码,内容包括…

银河麒麟服务器系统中intel-x710网卡丢包问题

银河麒麟服务器系统中intel-x710网卡丢包问题 一 系统环境二 问题描述三 问题分析过程3.1 查看网卡配置文件3.2 netstat -ni查看丢包和重传3.3 使用ethtool -S {网卡名}查看drop3.4 使用sar -n DEV查看丢包情况3.5 使用sar -n ETCP 1查看重传情况3.6 查看/proc/net/snmp中&…

python内置函数 N

python内置函数 N Python 解释器内置了很多函数和类型,任何时候都能使用。 N 名称描述next返回迭代器中的下一个元素。 next(iterator) next(iterator) next(iterator, default) next()是一个内置函数,用于从迭代器中获取下一个项目。它通常与迭代…

MySQL数据库基本操作和管理

目录 一.MySQL数据库基本操作 1.SQL分类 (1)数据库:database (2)表:table,行:row 列:column (3)索引:index (4&…

Resilience4j原理及应用:构建高可用性系统的熔断、限流与容错机制(一)

本系列文章简介: 在本系列文章中,我们将深入探讨Resilience4j的原理及应用,包括熔断器、限流器和容错策略的工作原理、配置方法以及最佳实践。通过学习和掌握Resilience4j的使用技巧,我们将能够更好地构建高可用性系统&#xff0c…

Linux网络编程: TCP协议首部与可选项简述

一、TCP/IP五层模型 物理层(Physical Layer):物理层是最底层,负责传输比特流(bitstream)以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流,例如通过电缆、光纤或无线传输等。…

python中字典相关知识点总结

1.字典的定义 字典:在Python中,字典是一系列键-值对。每个键都与一个值相关联,程序员可以通过键来访问与之相关联的值。 实际举例: student{name:xincun,age:18} 通过实例我们可以发现,键-值对是两个相关联的值。指…

如何实现数据库的主从复制?

如何实现数据库的主从复制? 数据库的主从复制是实现数据备份、负载均衡和故障恢复的重要策略。它涉及一个主数据库(Master)和一个或多个从数据库(Slave),主数据库负责处理写入操作,而从数据库则…

代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、47.全排列 II

文档讲解&#xff1a;491.递增子序列、46.全排列、47.全排列 II 题目链接&#xff1a;491.递增子序列、46.全排列、47.全排列 II 491.递增子序列 class Solution {List<List<Integer>> res new ArrayList<>();List<Integer> path new ArrayList<…

CodeWhisperer插件

一、前言 产品官网地址&#xff1a;What is CodeWhisperer? - CodeWhisperer Amazon CodeWhisperer 是一个通用的、由机器学习驱动的代码生成器&#xff0c;可实时为您提供代码建议。在您编写代码时&#xff0c;CodeWhisperer 会根据您现有的代码和注释自动生成建议。您的个…

JAVA 100道题(6)

6.创建一个表示矩形的类&#xff0c;包括宽度和高度属性&#xff0c;以及计算面积和周长的方法。 下面是一个简单的Python类&#xff0c;表示矩形&#xff0c;包含宽度和高度属性&#xff0c;以及计算面积和周长的方法&#xff1a; python复制代码 class Rectangle: def __ini…

机器人路径规划:基于斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

【随笔馆001-安住当下是最高的人生智慧】

&#x1f332;今天我去另外一个地方参加会议&#xff0c;结束后叫了一个滴滴&#xff0c;结果司机走错了路害我等了好久。我开始有点不悦&#xff0c;突然听到马路对面有一个人在弹萨克斯。我想与其在这里焦躁地等司机&#xff0c;还不如静下心来好好欣赏音乐。就这样&#xff…

【ROS】解决编译含有Python的ROS包遇到的 “Could NOT find PY_em (missing: PY_EM)“ 问题

使用ROS编译含有Python的ROS包时会遇到 “Could NOT find PY_em (missing: PY_EM)” 的错误。这个问题通常是由于ROS找不到正确的Python解释器而导致的。解决方法&#xff1a;通过指定正确的Python解释器路径来解决这个问题。Ubuntu系统的Python解释器通常位于 /usr/bin/python…

日期问题总结

做日期问题,首先把模版写下来,再根据具体情况具体分析,基本上考试考到日期问题都是模拟和枚举,数据量也不会太大,所以我们根据题目要求直接打暴力就可以过. 模板&#xff1a; const int months[]{//平年天数 0,31,28,31,30,31,30,31,31,30,31,30,31 }; int is_leap(int y){//…

小项目知识点

0.vue运行自启动 "dev": "vite --open" //package.json 1.Element-plus 安装element-plus pnpm i element-plus 如何使用&#xff1f; <el-button :icon"Plus">按钮</el-button> <script setup langts> import { Plus …

mysql 数据库 增删改查 基本操作

目录 一 SQL 详细介绍 &#xff08;一&#xff09;SQL 分类 &#xff08;二&#xff09; SQL 语言规范 &#xff08;三&#xff09;数据库对象和命名 1&#xff0c;数据库的组件(对象)&#xff1a; 2&#xff0c;命名规则&#xff1a; &#xff08;四&#xff09; SQL…

【Rust】——panic!和不可恢复的错误

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

使用Python查找字符串中包含的多个元素

目录 一、引言 二、基本字符串操作 使用in关键字查找子字符串 使用循环和条件判断查找多个子字符串 三、使用正则表达式进行高级搜索 导入re模块 使用re.search()查找单个模式 使用re.findall()查找多个模式 四、案例与代码 五、优化与扩展 六、总结 一、引言 在Py…

【5G NB-IoT NTN】3GPP R17 NB-IoT NTN介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…