公共字段自动填充:AOP切面//反射
This commit is contained in:
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