苍穹外卖后端开发(Day3) 菜品管理 公共字段自动填充 对于创建时间、创建人id,修改时间,修改人id等字段 重复性代码进行统一编写
自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法 package com.sky.annotation; /** * 自定义注解,用于标识某个方法需要进行功能字段自动填充处理。 * 这个注解可以应用于方法上,用于指示在特定的数据库操作时 * 需要自动填充某些功能字段。 */ @Target(ElementType.METHOD) // 指定注解可以用于方法 @Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时可用 public @interface AutoFill { /** * 数据库操作类型:用于指示自动填充的操作类型。 * 可选值包括 UPDATE 和 INSERT。 * * @return 操作类型 */ OperationType value(); } 自定义切面类AutoFillAspect, 统一拦截加入了AutoFill注解的方法,通过反射为公共字段赋值。 package com.sky.aspect; /** * 自定义切面, 实现公共字段自动填充 */ @Aspect @Component @Slf4j public class AutoFillAspect { /** * 定义切入点,匹配com.sky.mapper包下的所有方法,并且方法上需有@AutoFill注解 */ @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)") public void autoFillPointCut() { } /** * 前置通知,在目标方法执行前进行公共字段赋值 * * @param joinPoint 连接点,表示被拦截的方法调用 */ @Before("autoFillPointCut()") public void autoFill(JoinPoint joinPoint) { log.info("开始进行公共字段自动填充..."); // 获取当前被拦截方法的签名(方法信息) MethodSignature signature = (MethodSignature) joinPoint.getSignature(); // 从方法签名中获取@AutoFill注解 AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class); // 获取操作类型(INSERT或UPDATE) OperationType operationType = autoFill.value(); // 获取目标方法的参数(假设第一个参数是实体对象) Object[] args = joinPoint.getArgs(); if (args == null || args.length == 0) { return; // 如果没有参数则直接返回 } // 获取实体对象(目标方法的第一个参数) Object entity = args[0]; // 获取当前时间和当前操作用户ID LocalDateTime now = LocalDateTime.now(); Long currentId = BaseContext.getCurrentId(); // 根据操作类型判断是INSERT还是UPDATE操作 if (operationType == OperationType.INSERT) { try { // 通过反射调用实体对象的set方法,赋值创建和更新时间、创建和更新用户 Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class); Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class); Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class); Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class); // 调用方法进行赋值 setCreateTime.invoke(entity, now); setCreateUser.invoke(entity, currentId); setUpdateTime.invoke(entity, now); setUpdateUser.invoke(entity, currentId); } catch (Exception e) { e.printStackTrace(); // 捕获异常并打印 } } else if (operationType == OperationType.UPDATE) { try { // 通过反射调用实体对象的set方法,赋值更新时间和更新用户 Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class); Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class); // 调用方法进行赋值 setUpdateTime.invoke(entity, now); setUpdateUser.invoke(entity, currentId); } catch (Exception e) { e.printStackTrace(); // 捕获异常并打印 } } } } 在Mapper的方法上加入AutoFill注解 ...