91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring AOP自定義可重復注解沒有生效的示例分析

發布時間:2021-08-26 18:42:13 來源:億速云 閱讀:476 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“Spring AOP自定義可重復注解沒有生效的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Spring AOP自定義可重復注解沒有生效的示例分析”這篇文章吧。

    1. 問題背景

    工作中遇到這樣的場景:某個方法需要在不同的業務場景下執行特定的邏輯,該方法已經上生產,不想改變原來的代碼,因此決定用AOP做個切面執行邏輯。

    2. 不啰嗦,上代碼

    以下為核心代碼:

    定義注解:

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    @Repeatable(value = StartTaskRuns.class)
    public @interface StartTaskRun {
    
      int businessType() default 0;
    
    }
    
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface StartTaskRuns {
    
      StartTaskRun[] value();
    }

    定義切面

    @Aspect
    @Component
    public class StartTaskRunAspect {
    
      @AfterReturning(pointcut = "@annotation(com.freedom.code.annotation.StartTaskRun)", returning = "retValue")
      public void startTask(JoinPoint joinPoint, Object retValue) throws Exception {
        Object[] args = joinPoint.getArgs();
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        StartTaskRun[] annotations = method.getAnnotationsByType(StartTaskRun.class);
        for (StartTaskRun annotation : annotations) {
          System.out.println(annotation.businessType());
        }
      }
    }

    業務代碼加注解

      @StartTaskRun(businessType = 5)
      @StartTaskRun(businessType = 6)
      @Override
      @Transactional(rollbackFor = Exception.class)
      public String doCsmsStrategy(Long id) {
        // 業務邏輯
        return userDO.getId().toString();
      }

    debug的時候發現,切面的代碼沒有執行。

    3. 問題排查

    3.1 是不是切點寫得有問題,于是換成如下形式:

      @AfterReturning(pointcut = "execution(* com.freedom.code.service.UserServiceImpl.doCsmsStrategy(..))", returning = "retValue")
      public void startTask(JoinPoint joinPoint, Object retValue) throws Exception {
        Object[] args = joinPoint.getArgs();
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        StartTaskRun[] annotations = method.getAnnotationsByType(StartTaskRun.class);
        for (StartTaskRun annotation : annotations) {
          System.out.println(annotation.businessType());
        }
      }

    還是不行,但是我的工程中其他地方也是類似的寫法卻沒有問題啊。看起來不像是AOP配置不對的問題

    3.2 是不是使用的地方不是代理對象

    打斷點吧,如下:

    Spring AOP自定義可重復注解沒有生效的示例分析

    是使用cglib生成的代理對象,沒有問題啊,到底問題在哪里。沒辦法,面向百度編程吧,還真找到問題解決辦法。如下帖子:http://www.neiyidaogou.com/article/220762.htm

    4. 問題原因

    對于可重復注解,如果方法上用多個可重復注解,AOP攔截不到。需要用它的包裝類型注解做切點,改成以下代碼就可以了:

    @Aspect
    @Component
    public class StartTaskRunAspect {
    
      @AfterReturning(pointcut = "@annotation(com.freedom.code.annotation.StartTaskRun) || @annotation(com.freedom.code.annotation.StartTaskRuns)", returning = "retValue")
      public void startTask(JoinPoint joinPoint, Object retValue) throws Exception {
        Object[] args = joinPoint.getArgs();
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        StartTaskRun[] annotations = method.getAnnotationsByType(StartTaskRun.class);
        for (StartTaskRun annotation : annotations) {
          System.out.println(annotation.businessType());
        }
      }
    }

    以上是“Spring AOP自定義可重復注解沒有生效的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    清苑县| 宁陵县| 黑山县| 黎川县| 白朗县| 库伦旗| 吐鲁番市| 奇台县| 五华县| 崇仁县| 海盐县| 安庆市| 昌平区| 京山县| 镇赉县| 崇信县| 灵璧县| 新邵县| 威信县| 精河县| 怀仁县| 建昌县| 上饶市| 许昌市| 沅江市| 甘洛县| 榆林市| 景泰县| 河北区| 同心县| 贺兰县| 象州县| 铁力市| 阿拉尔市| 海南省| 肥城市| 衡水市| 山丹县| 长宁区| 鄯善县| 辽阳县|