本文主要是介绍苍穹外卖菜品管理aop注解反射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
自定义注解
切面类
公共字段填充代码实现aop+注解+反射
如果是环绕通知,要做方法形参中声明pro cd
其他四种声明 joinpoint
简单方法
package com.sky.aspect;import com.sky.annotation.AutoFill;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;
import java.time.LocalDateTime;/*** * @ClassName AutoFillAspect* @date 2024-06-10 11:10*/@Slf4j
@Aspect
@Component
public class AutoFillAspect {@Before("execution(* com.sky.mapper.*.*(..)) && @annotation(autoFill)")public void autoFillProperty(JoinPoint joinPoint, AutoFill autoFill) throws Exception {log.info("进入AOP程序, 为公共属性开始赋值 ");//1. 获取原始方法运行时传入的参数 , 获取第一个 (对象)Object[] args = joinPoint.getArgs();if (ObjectUtils.isEmpty(args)) { //参数为空return;}//拿到参数,接下来赋值Object obj = args[0];log.info("为公共属性开始赋值, 赋值前: {} ", obj);//2. 通过反射获取到对象对应方法 [ 4个 ]公共属性Method setCreateTime = obj.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setUpdateTime = obj.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setCreateUser = obj.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateUser = obj.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);//3. 获取注解对应的value属性//原始方法//拿到方法签名
// MethodSignature signature = (MethodSignature) joinPoint.getSignature();
// //拿到方法getMethod() 拿到方法的注解getAnnotation(AutoFill.class)
// AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);
// //拿到注解的属性
// OperationType operationType = annotation.value();//简单方法OperationType operationType = autoFill.value();//4. 判断, 如果是insert , 为4个属性复制if (operationType.equals(OperationType.INSERT)) {//invoke(obj, LocalDateTime.now()) 那个对象赋值,值是什么setCreateTime.invoke(obj, LocalDateTime.now());setCreateUser.invoke(obj, BaseContext.getCurrentId());}setUpdateTime.invoke(obj, LocalDateTime.now());setUpdateUser.invoke(obj, BaseContext.getCurrentId());log.info("为公共属性开始赋值, 赋值后: {} ", obj);}
}
package com.sky.annotation;import com.sky.enumeration.OperationType;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 标识哪些方法的属性需要被自动填充** @author * @ClassName* @date 2024-04-17 00:42*/
//运行时生效
@Retention(RetentionPolicy.RUNTIME)
//目标位置,方法上
@Target(ElementType.METHOD)
public @interface AutoFill {//属性 - 标识当前到底是新增 (INSERT) 还是 修改(UPDATE)OperationType value();}
这篇关于苍穹外卖菜品管理aop注解反射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!