From 2b4f2af8efb803eac47223be2560502c3f280ce7 Mon Sep 17 00:00:00 2001 From: slhaf <2998813882@qq.com> Date: Tue, 10 Sep 2024 17:54:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AC=E5=85=B1=E5=AD=97=E6=AE=B5=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=A1=AB=E5=85=85=EF=BC=9AAOP=E5=88=87=E9=9D=A2//?= =?UTF-8?q?=E5=8F=8D=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sky/annotation/AutoFill.java | 18 ++++ .../java/com/sky/aspect/AutoFillAspect.java | 86 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 sky-server/src/main/java/com/sky/annotation/AutoFill.java create mode 100644 sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java 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..225e2fb --- /dev/null +++ b/sky-server/src/main/java/com/sky/annotation/AutoFill.java @@ -0,0 +1,18 @@ +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 { + //指定数据库操作类型 + OperationType value(); +} 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..21deec4 --- /dev/null +++ b/sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java @@ -0,0 +1,86 @@ +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.Signature; +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) { + 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) { + 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 (NoSuchMethodException | IllegalAccessException | InvocationTargetException 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 (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } +}