公共字段自动填充:AOP切面//反射
This commit is contained in:
18
sky-server/src/main/java/com/sky/annotation/AutoFill.java
Normal file
18
sky-server/src/main/java/com/sky/annotation/AutoFill.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
86
sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java
Normal file
86
sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user