應用場景
在一些業務類的建立中,我們需要反覆對不同的類的同一個屬性進行賦值,那麼問題就出現了 **程式碼冗餘**如何解決呢
思路:利用aop創造一個切面
如何創造一個切面呢
實質上就是掃描加設定增強位置 那麼如何掃描到對應的賦值方法上呢 這裡需要用到自定義註解了 自定義註解://這裡的OperationType 是定義的一個列舉型別,value是裡面的列舉常量,在我們標識對應的方法中可以使用不同的常量來執行不同的判斷
//表明作用物件是方法
@Target(value = ElementType.METHOD)
//執行時實現的,aop必寫
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
OperationType value();
}
註解完成
註解完成,開始操刀aop切面
@Aspect//切面需要加的註解
@Component
@Slf4j
public class AutoFillAspect {
//這裡標識,此切面的範圍,也就是需要被增強的類,為了準確定位,我們還需要確認註解也在上面,使用poincut是為了減少冗餘程式碼
@Pointcut("execution(* com.sky.mapper.*.*(..))&&@annotation(com.sky.annotation.AutoFill)")
public void autoFillPointcut(){}
//before在執行前進行一個增強的操作,引數基本都是JoinPoint
@Before("autoFillPointcut()")
public void autoFill(JoinPoint joinPoint){
log.info("首位增強");
//透過引數獲取簽名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//透過簽名獲取自定義註解的值
AutoFill aution = signature.getMethod().getAnnotation(AutoFill.class);
OperationType value = aution.value();
//透過引數獲取對應的類
Object[] args = joinPoint.getArgs();
if(args.length==0||args== null){
return;
}
Object arg = args[0];
//透過判斷註解值後,getDeclaredMethod呼叫類裡面的賦值方法
if (value==OperationType.INSERT) {
LocalDateTime updateTime = LocalDateTime.now();
LocalDateTime createTime=LocalDateTime.now();
Long createUser= BaseContext.getCurrentId();
Long updateUser=BaseContext.getCurrentId();
try {
arg.getClass().getDeclaredMethod("setUpdateTime",updateTime.getClass());
arg.getClass().getDeclaredMethod("setCreateTime",createTime.getClass());
arg.getClass().getDeclaredMethod("setCreateUser",createUser.getClass());
arg.getClass().getDeclaredMethod("setUpdateUser",updateUser.getClass());
} catch (Exception e) {
throw new RuntimeException(e);
}
}else if(value==OperationType.UPDATE){
LocalDateTime updateTime = LocalDateTime.now();
Long updateUser=BaseContext.getCurrentId();
try {
arg.getClass().getDeclaredMethod("setUpdateUser",updateUser.getClass());
arg.getClass().getDeclaredMethod("setUpdateTime",updateTime.getClass());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}