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

news2024/11/24 5:37:49

文章目录

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

一、问题描述

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

操作日志信息包含:

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

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

二、问题分析

问题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; //主键ID
    private Long operateUser; //操作人ID
    private 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 {
    @Autowired
    private OperateLogMapper operateLogMapper;
    @Around("@annotation(com.sky.annotation.OperationLog)")
    public Object log(ProceedingJoinPoint joinPoint) {
        try {
            Long operateUser = BaseContext.getCurrentId();//操作人ID
            LocalDateTime 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.coloradmin.cn/o/1531798.html

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

相关文章

武汉星起航:专业团队引领,经验与创新共铸跨境电商新辉煌

在竞争激烈的跨境电商市场中,武汉星起航电商公司凭借其专业的运营团队和多年的行业经验,成功脱颖而出。这支拥有丰富经验的团队,不仅深刻了解跨境电商市场的动态,更通过持续创新和个性化解决方案,为合作伙伴提供了强有…

STM32CubeMX学习笔记26---FreeRTOS互斥量

一、互斥量简介 1、互斥量用于互锁,可以充当资源保护的令牌,当一个任务希望访问某个资源时,它必须先获取令牌,当任务使用完资源后,必须返还令牌,以便其他任务可以访问该资源。 2、互斥量一般用于临界资源…

GPT-4引领AI新纪元,Claude3、Gemini、Sora能否跟上步伐?

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚…

【XXL-JOB】分布式任务调度解决方案,XXL-JOB入门

目录 1 概念2 快速入门2.1 启动xxl-job-admin2.2 创建一个新的定时任务2.3 在调度中心新增定时任务 3 详细介绍3.1 新建执行器3.2 创建任务3.3 其他概念3.3.1 路由策略3.3.2 任务运行模式(BEAN、GLUE)3.3.3 阻塞处理策略3.3.4 子任务3.3.5 任务超时时间 3.4 高级任务用法3.4.1 …

源码编译部署LAMP

编译部署LAMP 配置apache [rootzyq ~]#: wget https://downloads.apache.org/apr/apr-1.7.4.tar.gz --2023-12-11 14:35:57-- https://downloads.apache.org/apr/apr-1.7.4.tar.gz Resolving downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104…

如何用 C++ 部署深度学习模型?

深度学习模型通常在诸如Python这样的高级语言中训练和验证,但在实际生产环境部署时,往往需要更高的执行效率和更低的资源占用。C作为一款性能卓越、低级别的编程语言,是部署深度学习模型的理想选择之一。本文将详细介绍如何在C环境下加载和运…

AI智能客服系统的费用

实现智能客服所需的费用取决于多个因素,包括项目的规模、所选择的技术和服务提供商、数据的获取和处理方式等。以下是一些可能影响费用的因素,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作…

使用stream流合并多个List(根据实体类特定属性合并)

开发情景 现有多个List集合,其中都是一样的实体类,这里我想根据实体类的特定属性将它们合并在一起,形成一个最终的List集合。 这里主要用到了Stream流的flatMap方法与reduce方法。 flatMap:可以将多个Stream流合并在一起,形成一个Stream流。 reduce:可以将Stram流中的元…

MySQL的概述与安装

一、数据库的基本概念: 1.1 数据: 1) 描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等 都是数据。 2)数据是以“记录”的形式按照统一的格式进行存储的,而不是…

ASA方舟生存飞升计划1.5重置版服务器搭建教程

ASA方舟生存飞升计划1.5重置版服务器搭建教程 大家好我是艾西一个做服务器租用的网络安全工程人员,以前有给大家分享过方舟生存进化的搭建架设教程。方舟这游戏出的时间也很久了,随着时间的推移官方有出新的版本命名为飞升计划,不少的玩家都…

数据库系统概论-第4章 数据库安全性

4.1 数据库安全性概述 4.2 数据库安全性控制 4.3 视图机制 4.4 审计 4.5 数据加密 4.6 其他安全性保护 4.7 小结

SVN修改已提交版本的注释

目录 一、需求分析 二、问题分析 三、解决办法 一、需求分析 ​开发过程中,在SVN提交文件后,发现注释写的不完整或不够明确,想再修改之前的注释文字​。 使用环境: SVN服务器操作系统:Ubuntu 20.04.6 LTS SVN版本&…

linux网络服务学习(2):vsftp

1.什么是vsftp vsftp是linux服务器上的一款使用ftp协议的软件,是linux上使用最广泛的ftp服务端软件 ftp协议是使用明文传输的,很不安全,一般用于局域网内的文件上传、下载 2.vsftp连接类型 ftp连接要用到2个端口:21、20端口。…

Visual Studio 2013 - 重置窗口布局

Visual Studio 2013 - 重置窗口布局 1. Microsoft Visual Studio 2013 - 重置窗口布局References 1. Microsoft Visual Studio 2013 - 重置窗口布局 窗口 -> 重置窗口布局 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

HarmonyOS定时器与定时任务

HarmonyOS 的 ArkTS 说白了 就是 TS和JS混合 加了一些新特性的语言 定时任务 就还是用 js代码就OK了 我们代码这样写 Entry Component struct Twox {build() {Row() {Column(){Button("触发定时任务").onClick(()>{setTimeout(()> {console.log(执行)},2000…

Halcon 凹坑检测案例

* 使用元组的方法 ImageFile:[] ImageFile[0]:D:/Halcon/产品上的凹坑检测/1.bmp ImageFile[1]:D:/Halcon/产品上的凹坑检测/2.bmp for Index : 0 to |ImageFile|-1 by 1read_image (Image, ImageFile[Index])* 二值化threshold (Image, Region, 100, 255)* 连通性connection (…

C语言实现流水灯

头文件 #ifndef __LED_H__ #define __LED_H__ #define RCC (*(unsigned int *)0X50000A28) #define GPIOE_MODER (*(unsigned int *)0X50006000) #define GPIOF_MODER (*(unsigned int *)0X50007000) #define GPIOE_OTYPER (*(unsigned int *)0X50006004) #define GPIOE_OSPE…

百度千帆模型初次体验【人工智能】

百度千帆模型初次体验【人工智能】 前言版权推荐百度千帆模型初次体验【人工智能】一、百度智能云平台1.领取代金券2.创建应用3.开通付费 二、SpringBoot1.创建SpringBoot项目2.配置文件3.配置Bean4.编写Util5.测试6.结果 三、问题四、资料 最后 前言 2024-3-20 13:38:33 以下…

亚马逊等跨境电商平台自养号测评的五个核心因素

一、安全稳定的环境系统 尽管市场上存在大量现成的系统和软件包,卖个软件或设备给你,这种基本上都没有解决风控的能力,因此,小编推荐大家还是自己掌握相关技术,避免过度依赖于外部资源,目前,也…

从零到一构建短链接系统(七)

1.convention目录下创建exception目录,并创建AbstractException类, ClientException类,ServiceException类,RemoteException类 /*** 抽象项目中三类异常体系,客户端异常、服务端异常以及远程服务调用异常** see Clien…