package com.ycl.aop;
|
|
import annotation.AutoFill;
|
import com.ycl.utils.SecurityUtils;
|
import enumeration.OperationType;
|
import lombok.extern.slf4j.Slf4j;
|
import org.aspectj.lang.JoinPoint;
|
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.util.Date;
|
|
@Aspect
|
@Component
|
@Slf4j
|
public class AutoFillAspect {
|
/**
|
* 切入点
|
*/
|
@Pointcut("execution(* com.ycl.platform.mapper.*.*(..)) && @annotation(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];
|
|
//准备赋值的数据
|
Date now = new Date();
|
Long userId = SecurityUtils.getUserId();
|
|
//根据当前不同的操作类型,为对应的属性通过反射来赋值
|
if(operationType == OperationType.INSERT){
|
//为4个公共字段赋值
|
try {
|
Method setCreateTime = entity.getClass().getDeclaredMethod("setCreateTime", Date.class);
|
Method setCreateUser = entity.getClass().getDeclaredMethod("setCreateUser", Long.class);
|
Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", Date.class);
|
Method setUpdateUser = entity.getClass().getDeclaredMethod("setUpdateUser", Long.class);
|
|
//通过反射为对象属性赋值
|
setCreateTime.invoke(entity,now);
|
setCreateUser.invoke(entity,userId);
|
setUpdateTime.invoke(entity,now);
|
setUpdateUser.invoke(entity,userId);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}else if(operationType == OperationType.UPDATE){
|
//为2个公共字段赋值
|
try {
|
Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", Date.class);
|
Method setUpdateUser = entity.getClass().getDeclaredMethod("setUpdateUser", Long.class);
|
|
//通过反射为对象属性赋值
|
setUpdateTime.invoke(entity,now);
|
setUpdateUser.invoke(entity,userId);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|