@Pointcut("execution(* com.domcer.mapper.*.*(..)) && @annotation(com.domcer.annotation.AutoFill)")
    public void pointcut() {
    }

    @Before("pointCut()")
    public void before(JoinPoint jp) throws NoSuchMethodException {

        // 先拿到被增强的方法的签名对象
        Signature signature = jp.getSignature();
        // 判断被增强的目标是否是一个方法 如果是进行强转
        if (!(signature instanceof MethodSignature))
            throw SkyException.throwException(ErrorEnums.AOP_ADVICE_ERROR);
        MethodSignature ms = (MethodSignature) signature;
        // 通过 jp 获取被增强的目标类的字节码对象
        // 通过字节码 反射拿到 目标方法
        Method method = ms.getMethod();
        // 获取method上的注解 并且拿到注解上的value值
        AutoFill annotation = method.getAnnotation(AutoFill.class);
        if (ObjUtil.isNull(annotation)) throw SkyException.throwException(ErrorEnums.AOP_ADVICE_ERROR);
        String value = annotation.value();
        // 根据不同的 value 修改属性值
        Object[] args = jp.getArgs();
        if (ArrayUtil.isEmpty(jp.getArgs()))
            throw SkyException.throwException(ErrorEnums.AOP_ADVICE_ERROR);
        ReflectUtil.setFieldValue(args[0], "updateTime", LocalDateTime.now());
        ReflectUtil.setFieldValue(args[0], "updateUser", TokenThreadLocal.get());
        if (StrUtil.equalsIgnoreCase(value, "INSERT")) {
            ReflectUtil.setFieldValue(args[0], "createTime", LocalDateTime.now());
            ReflectUtil.setFieldValue(args[0], "createUser", TokenThreadLocal.get());
        }
    }
}

获取代理对象进行增强(无法通过注解的方式使用)

public void before2(JoinPoint jp) throws NoSuchMethodException {
        // 先拿到被增强的方法的签名对象
        Signature signature = jp.getSignature();
        // 判断被增强的目标是否是一个方法 如果是进行强转
        if (!(signature instanceof MethodSignature))
            throw SkyException.throwException(ErrorEnums.AOP_ADVICE_ERROR);
        MethodSignature ms = (MethodSignature) signature;
        // 通过 jp 获取被增强的目标类的字节码对象
        Class<?> aClass = jp.getTarget().getClass();
        // 通过字节码 反射拿到 目标方法
        Method method = aClass.getMethod(ms.getName(), ms.getParameterTypes());
        // 获取method上的注解 并且拿到注解上的value值
        AutoFill annotation = method.getAnnotation(AutoFill.class);
        if (ObjUtil.isNull(annotation)) throw SkyException.throwException(ErrorEnums.AOP_ADVICE_ERROR);
        String value = annotation.value();
        // 根据不同的 value 修改属性值
        ReflectUtil.setFieldValue(method, "updateTime", LocalDateTime.now());
        ReflectUtil.setFieldValue(method, "updateUser", TokenThreadLocal.get());
        if (StrUtil.equalsIgnoreCase(value, "INSERT")) {
            ReflectUtil.setFieldValue(method, "createTime", LocalDateTime.now());
            ReflectUtil.setFieldValue(method, "createUser", TokenThreadLocal.get());
        }
    }
最后修改:2023 年 06 月 24 日
如果觉得我的文章对你有用,请随意赞赏