@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());
}
}