苍穹外卖-公共字段填充

一.公共字段自动填充

1.问题分析

业务表中有公共字段,create_time,create_user,update_time,update_user:

设置员工表中和菜品表中的这些字段需要大量的set方法,代码冗余,不便于后期维护。

2.实现思路

当修改create_time和create_user这两个字段是对应的Mapper层执行的操作类型是insert;

当修改update_time和update_user这两个字段是时对应的Mapper层执行的操作类型是insert或者是update。

这四个字段的操作时机是不一样的,我们目前明确了操作类型,对于这些公共的字段,我们的设计思路是统一来处理。即AOP,使用切面这种方式处理。假设我们需要执行对Mapper层的插入一条数据,那我们可以使用切面拦截这种操作,对所需要的公共字段进行赋值。但是我们不需要对持久层的所有方法都进行拦截和处理,比如查询和删除的方法就不需要。

所以我们需要一个字段或者标记来判断是否需要对方法进行拦截,对公共字段进行处理。这里我们引入注解自定义注解AutoFuil来进行标识。同时我们自定义一个切面类AutoFillAspect,统一拦截加入了AutoFill注解的方法,通过反射为公共字段赋值。因此我们在Mapper方法上加入AutoFill注解。

3.代码开发

(1)自定义注解AutoFill和枚举类

这里我们自定义注解@AutoFill,用于标识方法需要进行公共字段填充,@Target表明注解的应用范围是在方法上,@Retention表明注解会在运行时保留,方便切面读取。OperationType value()用来指定数据库操作类型,可以是insert 或 update,这个值将在切面中用来判断当前方法是插入操作还是更新操作。。

(2)自定义切面类AutoFillAspect

首先通过@pointcut注解定义了切入点,execution会拦截com.sky.mapper包下所有类的所有方法,@annotation(com.sky.annotation.AutoFill)会拦截@Autofill注解标识的所有方法。

这里我们使用前置通知的方式对公共字段进行处理,在执行数据库操作前自动填充公共字段,joinPoint是AOP提供的对象,用于访问正在执行的方法的相关信息。可以通过它获取方法签名、参数等。

我们使用joinPoint.getSignature()方法返回当前方法的签名信息,它包含方法的名字、返回类型、参数等信息,将其转换为MethodSignature类型。

getMethod()获取当前执行的方法对象,getAnnotation(AutoFill.class)获取方法上的 @AutoFill 注解对象,autoFill.value()获取注解中的操作类型,即数据库操作类型,INSERTUPDATE。

joinPoint.getArgs()获取正在执行的方法的参数,假设方法的第一个参数是实体对象,那么就从arg\[\]数组中取出这个对象。

最后根据操作类型(INSERTUPDATE)为字段赋值,以插入操作为例子,通过反射,首先使用 getDeclaredMethod 获取实体对象中的 setter 方法(根据字段名称),然后使用 invoke 方法调用这些方法,传入相应的值(当前时间和当前用户 ID)。

(3)在Mapper的方法上加入AutoFill注解

(4)在对应的实现类注释相关内容

相关推荐
猪猪拆迁队1 小时前
虚拟工厂仿真引擎的架构设计:让一条产线可编程、可观测、可干预
后端·ai编程
字节跳动数据库1 小时前
文章分享——相似函数处理方法
人工智能·后端·程序员
云技纵横1 小时前
@Transactional 失效的 7 种场景:第 5 种最难排查
后端
用户6757049885021 小时前
你知道 Go 结构体和结构体指针调用的区别吗?一文带你彻底搞懂!
后端·go
程序员cxuan2 小时前
读懂 Claude Code 架构分析系列,第一篇,开始!
人工智能·后端·架构
用户6757049885022 小时前
面试官问“装饰器模式”,这样回答薪资多要 3000!
后端
tntxia2 小时前
Geo Scene域名修改引起的一些问题
后端
用户298698530142 小时前
Java 实现 Word 文档加密与权限解除
java·后端
vanuan2 小时前
给你的A2A-Agent加把锁-认证鉴权实战指南
后端
Yeats_Liao2 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构