当前位置: 首页 > 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.dtcms.com/a/272716.html

相关文章:

  • 第35周—————糖尿病预测模型优化探索
  • 网络资源模板--基于Android Studio 实现的健身系统App
  • 什么是缺陷?如何描述一个缺陷?
  • gitlab+TortoiseGit克隆生成ppk方式
  • 二分查找篇——寻找旋转排序数组中的最小值【LeetCode】
  • 数学建模-
  • leetcode 3439. 重新安排会议得到最多空余时间 I 中等
  • 征程 6M 部署 Omnidet 感知模型
  • Spark伪分布式集群搭建(Ubuntu系统)
  • 查看uniapp 项目中没有用到依赖
  • CanOpen转EtherCAT网关与台达伺服的配置指南配置软件篇
  • Rust Web 全栈开发(三):使用 Actix 构建简单的 Web Service
  • 【解决方案】基于 Amazon CloudFormation 打造三层 Web 应用架构实战
  • GitHub信息收集
  • 如何利用个人电脑搭建FTP文件服务器实现远程协作
  • 第二章-AIGC入门-AI视频生成:几款实用AI视频生成工具全解析(7/36)
  • 精准估算如何选?功能点与故事点估算法全解析
  • Navicat实现MySQL数据传输与同步完整指南
  • 【Axure教程】中继器间图片的传递
  • Meta新注意力机制给 Transformer 升了级!底层架构的革命!
  • JAVA JVM对象的创建
  • 水陆联防智能升级:AI入侵检测系统守护零死角安全
  • 介绍 cnpm exec electron-packager
  • x86汇编语言入门基础(三)汇编指令篇3 位移运算
  • 【threejs】第一人称视角之八叉树碰撞检测
  • 蜻蜓I即时通讯系统重构宣言:破茧重生的技术革命-长痛不如短痛卓伊凡|麻子|果果
  • 大健康IP如何借“合规创新”抢占行业新风口|创客匠人
  • 解读 Go 中的 constraints包
  • 【TCP/IP】7. IP 路由
  • xml 知识总结: xsd,xsi:schemaLocation,xmlns,xmlns:xsi