87 lines
3.4 KiB
Java
87 lines
3.4 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|
|
}
|