From 661a7fb8c044412889befaba8d0ade359919cb19 Mon Sep 17 00:00:00 2001 From: LiShu <2945621619@qq.com> Date: Fri, 29 Nov 2024 16:29:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8C=85=E7=BB=93=E6=9E=84?= =?UTF-8?q?=EF=BC=8C=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B3=A8=E8=A7=A3=E5=92=8C?= =?UTF-8?q?=E5=88=87=E9=9D=A2=E7=B1=BB=EF=BC=8C=E7=94=A8=E4=BA=8E=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=A4=84=E7=90=86=E6=95=B0=E6=8D=AE=E5=BA=93=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E3=80=81=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE=E6=97=B6?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4=E5=92=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 5 -- .../java/com/sky/Aspect/AutoFillAspect.java | 74 +++++++++++++++++++ .../java/com/sky/annotation/AutoFill.java | 20 +++++ 3 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 sky-server/src/main/java/com/sky/Aspect/AutoFillAspect.java create mode 100644 sky-server/src/main/java/com/sky/annotation/AutoFill.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 540d695..82dbec8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -7,11 +7,6 @@ - diff --git a/sky-server/src/main/java/com/sky/Aspect/AutoFillAspect.java b/sky-server/src/main/java/com/sky/Aspect/AutoFillAspect.java new file mode 100644 index 0000000..989e38a --- /dev/null +++ b/sky-server/src/main/java/com/sky/Aspect/AutoFillAspect.java @@ -0,0 +1,74 @@ +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.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.time.LocalDateTime; + +/* +* 自定义切面,实现公共字段自动填充处理逻辑 +* */ +@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) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + log.info("开始进行公共字段的自动填充..."); + + //获取当前被拦截的方法上的数据库操作类型 + 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){ + 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); + }else if(operationType == OperationType.UPDATE){ + 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); + } + } +} diff --git a/sky-server/src/main/java/com/sky/annotation/AutoFill.java b/sky-server/src/main/java/com/sky/annotation/AutoFill.java new file mode 100644 index 0000000..8f320e7 --- /dev/null +++ b/sky-server/src/main/java/com/sky/annotation/AutoFill.java @@ -0,0 +1,20 @@ +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; + +/* +* 自定义注解 ,用于标识某个方法需要进行功能字段自动填充处理 +* */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface AutoFill { + + //数据库操作类型: UPDATE INSERT + OperationType value(); +}