目录
一、适用场景
1、自定义注解填充【公共字段】
2、日志记录等
二、操作步骤
1、新建自定义注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AutoFill { //指定属性,指定操作的类型 //指定数据库操作的类型,update,insert OperationType value(); }
2、新建切面类
在切面类上,定义Pointcut切入点,以及通知,切面=通知+切入点
/** * 自定义切面类,实现公共字段自动填充处理逻辑 * 以下注解是固定写法 */ @Aspect @Component @Slf4j public class AutoFillAspect { //切面=通知+切入点 /** * 切入点 */ @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)") public void autoFillPointCut(){} /** * 前置通知,需要在数据库语句执行之前,将公共字段的值赋值上去 */ @Before("autoFillPointCut()") public void autoFill(JoinPoint joinPoint) { log.info("Auto fill start"); //获取被拦截方法的操作类型 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]; //准备赋值的数据 LocalDateTime now = LocalDateTime.now(); Long currentId = BaseContext.getCurrentId(); //根据不同的操作类型,为这几个属性赋值 if (operationType==OperationType.INSERT) { //利用反射,为4个公共字段赋值 try { 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); setCreateTime.invoke(entity, now); setCreateUser.invoke(entity, currentId); setUpdateTime.invoke(entity, now); setUpdateUser.invoke(entity, currentId); } catch (Exception e) { throw new RuntimeException(e); } } 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); setUpdateTime.invoke(entity, now); setUpdateUser.invoke(entity, currentId); } catch (Exception e) { throw new RuntimeException(e); } } } }
3、使用自定义注解
将自定义注解放在对应的方法还是类上面,这里声明@Target(ElementType.METHOD)在方法上,我作用的是在mapper方法上的
@Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user,status)" + "values " + "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})") @AutoFill(OperationType.INSERT) void insert(Employee employee);