Java—AOP案例-记录操作日志

简介:上一篇文章“JAVA语言—AOP基础”已经详细的介绍了AOP的各个功能接口,已经使用步骤,这篇文章就是基于此来做的一个小案例。案例的功能是记录登录的用户对于数据库表的相关信息进行增、删、查、改的操作记录下来,并且存储到数据库中

目录

1、需求分析

2、操作步骤

2.1 引入起步依赖

2.2 创建表结构,引入实体类

2.3 自定义注解@MyLog

2.4 创建切面类

3、总结


1、需求分析

操作日志:

  • 记录登录用户的操作日志并且存储到服务器数据库中。
  • 日志信息包含:操作人、操作时间、执行方法的全类名、执行方法名、方法运行时的参数、返回值、方法执行时长。

思路分析:

  • 需要对所有业务类中的增、删、查、改 方法添加统一功能,使用AOP技术最为方便。
  • 由于增、删、查、改的方法名没有规律,可以通过注解@annotation和自定义注解完成目标方法匹配。

2、操作步骤

  • 准备:
    • 在案例中引入AOP的起步依赖
    • 导入准备好的数据库表结构,并引入对应的实体类 
  • 编码:
    • 自定义注解 @Log
    • 定义切面类,完成记录操作日志的逻辑

2.1 引入起步依赖

图2.1-1 添加依赖

2.2 创建表结构,引入实体类

  • 创建日志表结构(代码如下)
-- 操作日志表
create table operate_log(id int unsigned primary key auto_increment comment 'ID',operate_user int unsigned comment '操作人ID',operate_time datetime comment '操作时间',class_name varchar(100) comment '操作的类名',method_name varchar(100) comment '操作的方法名',method_params varchar(1000) comment '方法参数',return_value varchar(2000) comment '返回值',cost_time bigint comment '方法执行耗时, 单位:ms'
) comment '操作日志表';
  • 引入实体类(代码如下)
package com.itheima.tliaswebmanagement.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;@Data
@AllArgsConstructor
@NoArgsConstructor
public class OperateLog {private Integer id;  //IDprivate Integer operateUser; //操作人IDprivate LocalDateTime operateTime; //操作时间private String className; //操作类名private String methodName; //操作方法名private String methodParams; //操作方法参数private String returnValue; //操作方法返回值private Long costTime; //操作耗时
}

2.3 自定义注解@MyLog

因为采用@Annotation注解来实现定义切面类,所以需要提前创建自定义注解(代码如下)。

package com.itheima.tliaswebmanagement.aop;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME) //元注解:指定注解什么时候生效
@Target(ElementType.METHOD) //元注解:指定作用在什么地方
public @interface MyLog {
}

上面的代码,首先是在根目录下创建一个anno包,在这个包里面创建一个MyLog注解。

2.4 创建切面类

创建AOP切面类,用以在用户对于数据库表的相关信息进行增、删、查、改的操作记录下来,并且存储到数据库中。

package com.itheima.tliaswebmanagement.aop;import com.alibaba.fastjson.JSONObject;
import com.itheima.tliaswebmanagement.mapper.OperateLogMapper;
import com.itheima.tliaswebmanagement.pojo.OperateLog;
import com.itheima.tliaswebmanagement.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.util.Arrays;@Slf4j
@Component
@Aspect
public class LogAspect {@Autowiredprivate HttpServletRequest httpServletRequest;@Autowiredprivate OperateLogMapper operateLogMapper;@Around("@annotation(com.itheima.tliaswebmanagement.aop.MyLog)")public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable {log.info("around ... before ... ");//操作人ID - 当前登录员IDString jwt = httpServletRequest.getHeader("token");Claims claims = JwtUtils.parseJWT(jwt);Integer operateUser = (Integer) claims.get("id");//操作时间LocalDateTime operateTime = LocalDateTime.now();//操作类名String className = joinPoint.getTarget().getClass().getName();//操作方法名String methodName = joinPoint.getSignature().getName();//操作方法参数Object[] args = joinPoint.getArgs();String methodParams = Arrays.toString(args);//原始方法运行前long begin = System.currentTimeMillis();//调用原始目标方法运行Object result = joinPoint.proceed();//原始方法运行后long end = System.currentTimeMillis();//方法返回值String returnValue = JSONObject.toJSONString(result);//操作耗时Long costTime = end - begin;//记录操作日志log.info("around ... after ... ");OperateLog operateLog = new OperateLog(null, operateUser, operateTime, className, methodName, methodParams, returnValue, costTime);operateLogMapper.insert(operateLog);log.info("AOP 操作日志: {}", operateLog);return result;}
}

因在代码中已经将相应代码的功能作用做出了注释,就不在做多余说明。

3、总结

以上就是关于AOP案例-记录操作日志的小案例分享,希望大家能给个点赞支持。

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

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

相关文章

腾讯云轻量应用服务器详细介绍(全网超详细说明)

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器,CPU内存带宽配置高并且价格特别优惠,轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年,540元三年、2核4G5M带宽218元一年,756元3年、4核8G12M带宽646元15个月等&#xf…

微信小程序开发系列-08自定义组件模版特性

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

点成案例 | 如何利用细胞计数仪在单细胞测序中评估细胞

一、概述 单细胞测序技术能够用来表征异常细胞群,分析稀有细胞和细胞图谱网络,发现异质性等。由于单细胞测序巨大的应用潜力,目前此技术正在经历爆炸性增长。然而,单细胞测序需要成本和时间的大量投资。为了确保时间和资源的投资…

正确的认识 字节码文件

上一篇中认识了JVM的基本组成,我们说JVM只认识字节码文件。那么在字节码文件进入JVM之前,我们先认识了解字节码文件长什么样,我们作为工程师不需要去死扣底层的理论知识,但是我们只是需要正确的打开字节码文件 知道里面有哪些部分…

[Angular] 笔记 22:ElementRef

chatgpt: ElementRef 是 Angular 中的一个类,它用于包装对 DOM 元素的引用。它允许开发者直接访问与 Angular 组件关联的宿主 DOM 元素。 当在 Angular 中需要直接操作 DOM 元素时,可以使用 ElementRef。通常情况下,最好避免直接操作 DOM&a…

Prism介绍

Prism介绍 Prism是一个框架,用于在WPF、Xamarin Forms、Uno Platform和WinUI中构建松散耦合、可维护和可测试的XAML应用程序。 设计目标 为了实现下列目的: 创建能够由模块组成的程序,这些模块能够被单独地编写、组装、部署,并且对…

十三:爬虫-Scrapy框架(下)

一:各文件的使用回顾 1.items的使用 items 文件主要用于定义储存爬取到的数据的数据结构,方便在爬虫和 Item Pipeline 之间传递数据。 items.pyimport scrapyclass TencentItem(scrapy.Item):# define the fields for your item here like:title scr…

jmeter函数助手-常用汇总

一.函数助手介绍 1.介绍及作用 介绍: jmeter自带的一个特性,可以通过指定的函数规则创建后进行调用该函数,在后续接口请求参数中进行调用 作用 (1)做参数化。 2.如何使用 jmeter工具栏-->工具-->函数助手…

LabVIEW在大型风电机组状态监测系统开发中的应用

LabVIEW在大型风电机组状态监测系统开发中的应用 风电作为一种清洁能源,近年来在全球范围内得到了广泛研究和开发。特别是大型风力发电机组,由于其常常位于边远地区如近海、戈壁、草原等,面临着恶劣自然环境和复杂设备运维挑战。为了提高风电…

DockerCompose - 容器编排、模板命令、compose命令、Pottainer 可视化界面管理(一文通关)

目录 一、DockerCompose 容器编排 1.1、简介 1.2、Docker-Compose 安装 1.2.1、在线安装 1.2.2、离线安装 1.3、docker-compose.yml 中的模板命令 前置说明 模板命令 1.4、DockerCompse 命令 前置说明 up down exec ps restart rm top pause暂停 和 unpause恢…

linux下的进程布局与ububtu操作系统下的proc文件夹学习笔记一

相关内容我写在公众号,写的挺详细的,欢迎关注我的公众号。请使用鼠标右键,新建标签页打开,直接点击显示参数错误,不知道怎么回事?linux下的进程布局与ububtu操作系统下的proc文件夹学习笔记 (qq.com)https:…

Windows下配置GCC(MinGW)环境

一、下载并安装MinGW 步骤1:下载MinGW安装器 前往MinGW的官方下载源,通过以下链接可以获取到最新版的MinGW安装程序: 网页地址:https://sourceforge.net/projects/mingw/files/ [MinGW 下载地址](https://sourceforge.net/proj…

二级路由的配置以及注意项

二级路由 比如说LayOut组件是父亲,LayOut和ArtComp是儿子,那我们怎么给儿子配路由呢? 1、首先在router下的index.js导入组件,配置规则,详细如下 // 导入路由相关组件 import LayOut from /views/LayOut import UserC…

页面布局--Flexbox的自动边距

标题页面布局–Flexbox的自动边距 通过简单的margin:auto,我们就能实现元素的多种对齐方式。 假设我们在盒子模型里有四个元素: 先给容器使用flex布局: .container {display: flex;justify-content: flex-start;align-items: center;gap: 6…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-00x00

如上表所示,MOE0,OSSI0,CCxE0,CCxNE0时,OCx与OCxN的输出状态取决于GPIO端口上下拉状态。 ---------------------------------------------------------------------------------------------------------------------…

Windows环境安装和运行shell脚本,值得收藏!

1. 安装步骤 1.1 下载安装包 官网下载地址Git - Downloads, 我们选择 Windows 版本; CSDN下载地址:windows版本下载; 1.2 环境变量配置 在系统变量中找到Path,将git安装目录下的bin(我的安装路径&#x…

【华为机试】2023年真题B卷(python)-计算最大乘积

一、题目 题目描述: 给定一个元素类型为小写字符串的数组,请计算两个没有相同字符的元素长度乘积的最大值,如果没有符合条件的两个元素,返回0。 二、输入输出 输入描述: 输入为一个半角逗号分隔的小写字符串的数组,2 &…

数字PID算法基础

数字PID是由编程语言实现的PID算法并烧录到控制芯片中,控制芯片与电机驱动连接,将PID控制算法的输出转换为PWM控制信号发送给电机驱动电路,电机驱动电路与直流电机相连并将PWM控制信号转换为具有相同占空比的PWM供电电压,通过对输…

Jmeter之从CSV文件获取数据

新建csv文件 新建一个excel,填充业务数据,然后导出csv格式文件。 添加一个CSV数据文件 使用

认识K8S的基本概念和原理

K8S:Kubernetes8个字母省略就是k8s 自动部署,自动扩展和容器化部署的应用程序的一个开源系统 k8s是负责自动化运维管理多个容器化程序的集群。是一个功能强大的容器编排工具。分布式和集群化的方式进行容器管理。 k8s的版本:1.15或1.18。使…