Spring AOP 實現《自動自動填充Entity》

一个小笨蛋發表於2024-03-28

定義註解

AutoFill.java

/**
 * 自定義註解,實現自動填填充功能
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    OperationType value() default  OperationType.INSERT;
}

定義AOP

AutoFillAspect.java

@Aspect
@Component
@Slf4j
public class AutoFillAspect {

    /**
     * 定義切點
     */
    @Pointcut(value = "execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.aspect.annotation.AutoFill)")
    public void autoFillPointCut(){}
    @Before("autoFillPointCut()")
    public void autoFill(JoinPoint joinPoint){
        log.info("開始自動填充autoFill");
        //獲取到當前被攔截的方法上的資料庫操作型別
        MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //方法簽名物件
        AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);//獲取方法上的註解物件
        OperationType operationType = annotation.value();//獲取註解上自定義的操作型別

        //獲取註解上的引數
        Object[] args = joinPoint.getArgs();
        if(args == null || args.length == 0) return ;

        Object entity = args[0] ;

        LocalDateTime nowTime = LocalDateTime.now(); //當前時間
        Long currentId = BaseContext.getCurrentId(); // 當前登入使用者Id

        if(operationType == OperationType.INSERT){ //插入操作
            try {
                Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
                Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
                //透過反射賦值
                if(setCreateTime!=null){
                    setCreateTime.invoke(entity,nowTime);
                }
                if(setUpdateTime!=null){
                    setUpdateTime.invoke(entity,nowTime);
                }
                if(setUpdateUser!=null){
                    setUpdateUser.invoke(entity,currentId);
                }
                if(setCreateUser!=null){
                    setCreateUser.invoke(entity,currentId);
                }
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }else if(operationType == OperationType.UPDATE){
             try {
                 Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                 Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
                 if(setUpdateTime!=null){
                     setUpdateTime.invoke(entity,nowTime);
                 }
                 if(setUpdateUser!=null){
                     setUpdateUser.invoke(entity,currentId);
                 }

             }catch (Exception ex){
                 ex.printStackTrace();
             }
        }
    }
}

列舉


/**
 * 資料庫操作型別
 */
public enum OperationType {

    /**
     * 更新操作
     */
    UPDATE,

    /**
     * 插入操作
     */
    INSERT

}

相關文章