当前位置: 首页 > news >正文

Spring--04--1--AOP自定义注解,记录用户操作日志

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 记录用户操作日志
    • 思路
    • 1.@OperateLog注解
    • 2.AOP切面类
    • 3.示例代码片段


记录用户操作日志

  • 金融、交易类应用的日志Log非常重要,这类应用的业务包含了日志记录逻辑,比如记录用户的交易记录。
  • 对于重要的日志数据,我们是一定要持久化到数据库和磁盘上的,还有一些日志的数据,则是为了方便运营人员的操作记录。

思路

在 Java 开发中,@OperateLog 通常是一个自定义注解,主要用于记录用户操作日志,是系统日志管理模块的常见实现方式。它的作用是通过注解标记需要监控的方法,配合 AOP(面向切面编程)技术,在方法执行前后自动记录操作详情(如操作人、操作时间、操作内容、操作结果等),避免在业务代码中硬编码日志记录逻辑,实现日志功能与业务逻辑的解耦。

通过Aspect代理我们真正的业务逻辑对象,添加日志记录的逻辑,只需要在Service层方法上加入@OperateLog注解即可

工作原理

  • 标记方法:在需要记录日志的方法上添加@OperateLog注解,并指定相关属性(如module = “用户管理”, type = “删除”)。
  • AOP 切面拦截:定义一个 AOP 切面类,通过@Around或@AfterReturning等注解拦截被@OperateLog标记的方法。
  • 自动记录日志:在切面中通过反射获取注解属性和方法的上下文信息(如参数、用户信息、执行时间等),并将这些信息保存到日志表(如你之前提到的t_system_operate_log)中。

1.@OperateLog注解

  • 接口调用日志:标记 Controller 层的接口方法,记录用户的 HTTP 请求(如登录、新增、修改、删除等操作)。
  • 业务操作追踪:标记 Service 层的核心业务方法,记录关键业务流程的执行情况(如订单创建、权限变更等)。

注解通常包含的属性
自定义的@OperateLog注解可能会定义一些属性,用于描述操作的具体信息,例如:

@Target(ElementType.METHOD) // 注解作用在方法上
@Retention(RetentionPolicy.RUNTIME) // 运行时保留,可通过反射获取
public @interface OperateLog {// 操作模块(如“用户管理”“订单管理”)String module() default "";// 操作类型(如“新增”“删除”“查询”)String type() default "";// 操作描述(如“用户XXX删除了订单XXX”)String desc() default "";// 是否记录请求参数boolean recordParams() default true;// 是否记录返回结果boolean recordResult() default true;
}

2.AOP切面类

// AOP切面类(简化版)
@Aspect
@Component
public class OperateLogAspect {@Autowiredprivate OperateLogService logService;// 拦截所有被@OperateLog标记的方法@Around("@annotation(operateLog)")public Object recordLog(ProceedingJoinPoint joinPoint, OperateLog operateLog) throws Throwable {// 1. 前置处理:获取操作人、请求参数等信息String username = SecurityContextHolder.getContext().getAuthentication().getName();Object[] params = joinPoint.getArgs();// 2. 执行原方法Object result = joinPoint.proceed();// 3. 后置处理:记录日志到数据库OperateLogPO logPO = new OperateLogPO();logPO.setModule(operateLog.module());logPO.setType(operateLog.type());logPO.setOperateContent(operateLog.desc());logPO.setOperateUser(username);logPO.setOperateTime(new Date());// ... 其他字段赋值logService.save(logPO);return result;}
}

3.示例代码片段

// 控制器方法中使用@OperateLog
@RestController
@RequestMapping("/user")
public class UserController {@DeleteMapping("/{id}")@OperateLog(module = "用户管理", type = "删除", desc = "删除指定ID的用户")public Result deleteUser(@PathVariable Long id) {// 业务逻辑:删除用户userService.delete(id);return Result.success();}
}
http://www.lryc.cn/news/584068.html

相关文章:

  • 【MSSQL】如何清理SQL SERVER内存解决内存占用高的问题
  • 【免费数据】2020年中国高精度耕地范围矢量数据
  • Docker:安装命令笔记
  • 智慧城市网络架构升级与SD-WAN技术应用实践
  • 上海交大医学院张维拓老师赴同济医院做R语言训练营培训
  • QT Android 如何打包大文件到目录下?
  • 【牛客刷题】活动安排
  • 华为鸿蒙HarmonyOpenEye项目:开眼App的鸿蒙实现之旅
  • OpenGL 4. 变换
  • 【STM32 学习笔记】SPI通信协议
  • 《PyQt6-3D应用开发技术文档》
  • 【Note】Linux Kernel 之 内核架构、源码文件、API/ABI 、FHS
  • JVM 基础 - JVM 内存结构
  • 龙迅#LT7911E适用于TPYE-C/DP/EDP转MIPIDSI/LVDS应用功能,支持DSC 分辨率缩放,分辨率高达4K60HZ!
  • 基于联邦学习的医疗数据隐私保护模型设计与实现
  • 【深度学习新浪潮】什么是持续预训练?
  • 网安系列【16】之Weblogic和jboss漏洞
  • Linux驱动06 --- UDP
  • 货车车架和悬架设计cad【7张】+设计说明书
  • 前端面试专栏-算法篇:21. 链表、栈、队列的实现与应用
  • 分布式ID 与自增区别
  • 【spring boot】三种日志系统对比:ELK、Loki+Grafana、Docker API
  • 膨胀卷积介绍
  • XGBoosting算法详解(Boosting思想的代表算法)
  • 字节 Seed 团队联合清华大学智能产业研究院开源 MemAgent: 基于多轮对话强化学习记忆代理的长文本大语言模型重构
  • 深度学习中的常见损失函数详解及PyTorch实现
  • PyTorch Tensor 操作入门:转换、运算、维度变换
  • pytorch 神经网络
  • PyTorch自动微分:从基础到实战
  • 【Pandas】pandas DataFrame from_records