74 lines
3.0 KiB
Java
74 lines
3.0 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.Method;
|
||
|
import java.time.LocalDateTime;
|
||
|
import java.time.LocalTime;
|
||
|
|
||
|
// 自定义切面,实现公共字段自动填充
|
||
|
@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 localDateTime = LocalDateTime.now();
|
||
|
Long id = 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().getMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
|
||
|
Method setUpdateUser = entity.getClass().getMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
|
||
|
|
||
|
setCreateTime.invoke(entity, localDateTime);
|
||
|
setCreateUser.invoke(entity, id);
|
||
|
setUpdateTime.invoke(entity, localDateTime);
|
||
|
setUpdateUser.invoke(entity, id);
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
} 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, localDateTime);
|
||
|
setUpdateUser.invoke(entity, id);
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|