乐于分享
好东西不私藏

若依操作日志源码深度解析:太干太枯燥?我让AI重写了一遍,大家看看是不是更拉跨了!

若依操作日志源码深度解析:太干太枯燥?我让AI重写了一遍,大家看看是不是更拉跨了!

大家好,我是若依框架教程。

之前咱们的若依源码解析系列干货太硬,后台阅读量看得我直挠头。

为了拯救阅读体验,我这次决定“摇人”——把文章投喂给了 AI 助手 Gemini,让它帮我用“人话”重新包装了一下这篇 @Log 切面的原理解析。

各位同学,检验 AI 成色的时刻到了!

这篇由“老兵技术大纲 + AI 润色排版”的混合双打文章,读起来到底是“丝滑通透”,还是“AI 味太冲、太拉跨”?

欢迎在评论区留言无情吐槽!要是大家觉得 Gemini 写的太拉,我下期还是老老实实回去全手工码字!


只要你用若依写过哪怕一天的接口,你绝对见过这个东西:

@Log(title = "用户管理", businessType = BusinessType.INSERT)

我们在 Controller 的方法上随手贴上这行代码,就像施了魔法一样——接口只要一被调用,数据库的sys_oper_log表里就会自动乖乖躺好一条记录,里面不仅有操作人、请求IP、请求参数,甚至连执行时间和返回结果都一清二楚。

很多新手朋友觉得很神奇:我明明一行记日志的业务代码都没写啊?是谁在替我负重前行?

今天,咱们就从源码层面,把若依这套极其优雅的“操作日志系统”扒个底朝天。

弄懂了它,你不仅能搞定项目里的日志需求,还能在面试或项目答辩时,把 Spring AOP 讲得明明白白。

01. 幕后黑手:Spring AOP (面向切面编程)

想解开这个谜团,答案只有三个英文字母:AOP

如果不用 AOP,我们记日志会变成什么样?

你得在每个业务方法的最前面记下开始时间,在最后面获取结果,再拼装成实体类存进数据库。

代码又臭又长,满屏都是复制粘贴。

而若依的做法是:找一个“保安”(切面 LogAspect),站在接口调用的必经之路上。

不管是哪个用户来看门,只要他的胸牌上带着@Log这个标记,保安就会自动记录他的长相(参数)、进出时间(耗时),然后放他进去办事。

核心代码就在ruoyi-framework/aspectj/LogAspect里。这个类头上顶着@Aspect和@Component,告诉 Spring:“我是一个切面,随时待命。”

02. “保安”是怎么精准拦截的?

若依通过定义切点(Pointcut),划定了保安的巡逻范围:

@Pointcut("@annotation(com.ruoyi.common.annotation.Log)")

这行代码的意思简单粗暴:别管是哪个类、哪个方法,只要头上戴着@Log这顶帽子的,统统给我拦下来!

当你调用接口时,真实的执行流程其实被“劫持”成了这样:

请求到达 → AOP拦截 (发现@Log) → 记录准备信息 → 执行你的业务代码 → 记录返回结果 → 结束。

03. 扒开细节:日志记录的“无间道”三部曲

若依的 AOP 拦截并非一刀切,而是极其克制地分成了三个阶段:

阶段一:进门前 (@Before)

这个时候你的业务还没跑。若依先偷偷记下请求的开始时间、当前操作用户的名字(从SecurityUtils.getLoginUser()拿)、还有你传进来的那一堆参数(通过joinPoint.getArgs()拿到并转成 JSON)。

阶段二:办完事 (@AfterReturning)

如果你的方法顺利跑完没有报错,若依会把方法的返回值(jsonResult)和最终耗时(costTime)补齐。

阶段三:搞砸了 (@AfterThrowing)

如果在执行过程中抛了异常呢?别慌,日志系统不仅不会挂,还会忠实地把异常信息记录下来,方便你日后甩锅(划掉)排查问题。

这三步走完,一个血肉丰满的SysOperLog对象就诞生了。

04. 灵魂拷问:每次操作都写数据库,接口不会卡死吗?

重点来了!这也是这套系统设计里最值钱的地方。

试想一下,如果每次用户点个按钮,程序都要等日志慢吞吞地写进 MySQL 才能返回结果,那高并发的时候系统不得原地爆炸?

若依在这个地方用了一个非常漂亮的设计:异步写入

在封装好日志对象后,AOP 并没有直接调用 Mapper 写入数据库,而是干了这么一件事:

AsyncManager.me().execute(AsyncFactory.recordOper(operLog));

它把写日志的任务打包成了一个包裹,直接扔给了后台的异步线程池去处理。

主线程扔完包裹转头就给前端返回结果了。这种“管杀不管埋”的做法,极大地缩短了接口的响应时间,保证了系统的极高吞吐量。

05. 抄作业时间:为什么说这套设计极其优雅?

读懂了若依的操作日志源码,其实你就掌握了大型企业级项目里处理横切关注点(Cross Cutting Concern)的标准答案。

总结一下它的四大亮点,建议直接背诵:

极度解耦:业务代码里除了贴个@Log,没有任何脏代码,干干净净。

统一管理:所有的日志抓取逻辑全被圈养在一个类里,改一处即可全局生效。

性能极佳:异步线程池兜底,写日志绝不拖慢主业务的后腿。

无限扩展:学会了这一招,你想加个“安全审计日志”或者“接口限流切面”,不也就是照猫画虎的事儿吗?

代码的优雅不在于用了多少炫酷的技术,而在于把复杂的事情做到了极简。

下次再写@Log的时候,是不是觉得这行注解变得亲切多了呢?

如果你对若依源码感兴趣,可以阅读此系列其他文章(看看Gemini是否有改进):

AI 时代的源码深度解析:很多人会用若依(RuoYi)代码生成器,但很少有人真正懂它

AI 时代的源码深度解析:若依(RuoYi)权限体系源码深度解析:RBAC是怎么落地的

若依登录认证源码深度解析:Spring Security + JWT是怎么工作的

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 若依操作日志源码深度解析:太干太枯燥?我让AI重写了一遍,大家看看是不是更拉跨了!

猜你喜欢

  • 暂无文章