1、自定义注解 AutoFill
进入到zsh-server模块,创建com.zsh.annotation包
package com.zsh.annotation; import com.zsh.enumeration.OperationType; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义注解,用于标识某个方法需要进行功能字段自动填充处理 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AutoFill { //数据库操作类型:UPDATE INSERT OperationType value(); }
2、其中OperationType已在zsh-common模块中定义
这是一个枚举
package com.zsh.enumeration; /** * 数据库操作类型 */ public enum OperationType { /** * 更新操作 */ UPDATE, /** * 插入操作 */ INSERT }
3、自定义切面 AutoFillAspect
package com.zsh.aspect; import com.zsh.annotation.AutoFill; import com.zsh.constant.AutoFillConstant; import com.zsh.context.BaseContext; import com.zsh.enumeration.OperationType; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.time.LocalDateTime; /** * 自定义切面类,实现公共字段自动填充处理逻辑 */ @Aspect @Component @Slf4j public class AutoFillAspect { /** * 切入点 */ @Pointcut("execution(* com.zsh.mapper.*.*(..)) && @annotation(com.zsh.annotation.AutoFill)") public void autoFillPointCut(){ } /** * 前置通知,在通知中进行公共字段的赋值 */ @Before("autoFillPointCut()") public void autoFill(JoinPoint joinPoint) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { log.info("自动添加数据已执行"); // 获取到带你给钱背拦截的方法 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //方法签名对象 AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class); // 获得方法上的注解对象 OperationType operationType = autoFill.value(); // 获得数据库操作类型 // 获取到当前被拦截的方法的参数 Object[] args = joinPoint.getArgs(); if(args == null || args.length == 0){ return; } Object entity = args[0]; // 为四个公共字段赋值 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); //根据当前不同的操作类型,为对应的属性通过反射来赋值 if(operationType == OperationType.INSERT){ // 通过反射为对象属性赋值 setCreateTime.invoke(entity,LocalDateTime.now()); setCreateUser.invoke(entity,BaseContext.getCurrentId()); setUpdateTime.invoke(entity,LocalDateTime.now()); setUpdateUser.invoke(entity,BaseContext.getCurrentId()); }else if(operationType == OperationType.UPDATE){ // 通过反射为对象属性赋值 setUpdateTime.invoke(entity,LocalDateTime.now()); setUpdateUser.invoke(entity,BaseContext.getCurrentId()); } } }
4、在Mapper接口的方法上加入 AutoFill 注解
package com.zsh.mapper; @Mapper public interface CategoryMapper { /** * 插入数据 * @param category */ @Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" + " VALUES" + " (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})") @AutoFill(value = OperationType.INSERT) void insert(Category category); /** * 根据id修改分类 * @param category */ @AutoFill(value = OperationType.UPDATE) void update(Category category); }