定義註解
AutoFill.java
/**
* 自定義註解,實現自動填填充功能
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
OperationType value() default OperationType.INSERT;
}
定義AOP
AutoFillAspect.java
@Aspect
@Component
@Slf4j
public class AutoFillAspect {
/**
* 定義切點
*/
@Pointcut(value = "execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.aspect.annotation.AutoFill)")
public void autoFillPointCut(){}
@Before("autoFillPointCut()")
public void autoFill(JoinPoint joinPoint){
log.info("開始自動填充autoFill");
//獲取到當前被攔截的方法上的資料庫操作型別
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //方法簽名物件
AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);//獲取方法上的註解物件
OperationType operationType = annotation.value();//獲取註解上自定義的操作型別
//獲取註解上的引數
Object[] args = joinPoint.getArgs();
if(args == null || args.length == 0) return ;
Object entity = args[0] ;
LocalDateTime nowTime = LocalDateTime.now(); //當前時間
Long currentId = BaseContext.getCurrentId(); // 當前登入使用者Id
if(operationType == OperationType.INSERT){ //插入操作
try {
Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
//透過反射賦值
if(setCreateTime!=null){
setCreateTime.invoke(entity,nowTime);
}
if(setUpdateTime!=null){
setUpdateTime.invoke(entity,nowTime);
}
if(setUpdateUser!=null){
setUpdateUser.invoke(entity,currentId);
}
if(setCreateUser!=null){
setCreateUser.invoke(entity,currentId);
}
}catch (Exception ex){
ex.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);
if(setUpdateTime!=null){
setUpdateTime.invoke(entity,nowTime);
}
if(setUpdateUser!=null){
setUpdateUser.invoke(entity,currentId);
}
}catch (Exception ex){
ex.printStackTrace();
}
}
}
}
列舉
/**
* 資料庫操作型別
*/
public enum OperationType {
/**
* 更新操作
*/
UPDATE,
/**
* 插入操作
*/
INSERT
}