Lambda表达式实现通用变量审计拦截器,通过Supplier+Consumer解耦捕获与记录逻辑,支持延迟执行、字段链式访问、变更比对、上下文封闭及多维审计组合。

用 Lambda 表达式实现通用变量审计拦截器,核心在于把“捕获变量变化”和“记录业务轨迹”的逻辑解耦,让拦截行为可复用、可配置、不侵入业务代码。关键不是写一个万能方法,而是设计一个能接收任意对象、任意字段、任意触发时机的轻量级钩子。
用 Supplier + Consumer 构建可延迟执行的审计契约
Lambda 的优势在于延迟求值和函数式组合。定义一个通用审计方法,参数为被审计对象的 Supplier
- 这样调用方无需提前计算值,避免无意义的对象构造或 getter 调用
- 业务层只需传入 lambda,例如
() -> order和t -> t.getStatus(),完全不感知审计框架 - 支持链式字段访问:用
t -> t.getUser().getDept().getName()也能正常工作
结合反射 + Lambda 实现字段变更比对(无 POJO 侵入)
要记录“从 A 变为 B”,不能只记当前值。可封装一个 AuditDelta
- 传入旧对象 supplier 和新对象 supplier,再传入字段提取器(Function)
- 执行时分别 apply 获取旧值、新值,自动跳过 null 或 equals 相同的情况
- 仅当有差异时才触发 Consumer 记录,例如:
log.info("订单状态变更:{} → {}", oldStatus, newStatus) - 无需在实体类加注解或继承基类,适合遗留系统快速接入
用 Runnable + Closure 捕获上下文信息,支撑业务轨迹还原
单条日志无法体现“谁在什么流程中改了什么”。可在审计入口处用 Lambda 封闭当前上下文(如 traceId、操作人、业务阶段):
- 定义方法
audit(String stage, Runnable auditAction),stage 是业务阶段标识(如 "submit"、"pay") - 调用时写成
audit("createOrder", () -> { order.setStatus(CREATED); }) - 拦截器在执行 run 前记录 stage + 当前 ThreadLocal 中的 traceId / userId,执行后补上结果状态
- 最终日志形如:
[trace-abc123][user-789] createOrder → status=CREATED (success)
组合使用:一次调用覆盖读、写、变更、上下文四维审计
实际业务常需同时记录“读了哪些字段”“改了哪些字段”“为什么改”“谁发起的”。可提供一个高阶方法:
auditTrail("orderProcess").onRead(o -> o.getAmount())
.onUpdate(o -> o.getStatus(), old -> old == PENDING, (oldV, newV) -> "状态升迁")
.execute(() -> processOrder(order));
背后由多个 Lambda 协同完成:onRead 触发前置快照,onUpdate 绑定变更条件与语义描述,execute 执行业务并聚合输出结构化轨迹事件(JSON 或 Event 对象),供后续查询或告警。

















