總結一下公共欄位(aop加自定義註解加反射)

浮白呀發表於2024-05-05

應用場景

在一些業務類的建立中,我們需要反覆對不同的類的同一個屬性進行賦值,那麼問題就出現了 **程式碼冗餘**

如何解決呢

思路:利用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);
            }
        }
    }
}

相關文章