最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring AOP自定義可重復(fù)注解沒有生效問題

 更新時間:2021年08月25日 15:29:08   作者:tobebetter9527  
本文主要介紹了Spring AOP自定義可重復(fù)注解沒有生效問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

1. 問題背景

工作中遇到這樣的場景:某個方法需要在不同的業(yè)務(wù)場景下執(zhí)行特定的邏輯,該方法已經(jīng)上生產(chǎn),不想改變原來的代碼,因此決定用AOP做個切面執(zhí)行邏輯。

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());
    }
  }
}

業(yè)務(wù)代碼加注解

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

debug的時候發(fā)現(xiàn),切面的代碼沒有執(zhí)行。

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());
    }
  }

還是不行,但是我的工程中其他地方也是類似的寫法卻沒有問題啊??雌饋聿幌袷茿OP配置不對的問題

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

打斷點吧,如下:

在這里插入圖片描述

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

4. 問題原因

對于可重復(fù)注解,如果方法上用多個可重復(fù)注解,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());
    }
  }
}

到此這篇關(guān)于詳解Spring AOP自定義可重復(fù)注解沒有生效問題的文章就介紹到這了,更多相關(guān)Spring AOP注解沒有生效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

襄垣县| 南岸区| 慈利县| 涟源市| 寿光市| 扎赉特旗| 常州市| 吉首市| 柳州市| 河北区| 太谷县| 闽清县| 临沂市| 双牌县| 吉安县| 资兴市| 稷山县| 桂阳县| 集安市| 西和县| 琼中| 阳高县| 方山县| 平顶山市| 广安市| 瓮安县| 株洲县| 郑州市| 柳河县| 长兴县| 吴忠市| 云浮市| 上林县| 乐东| 桐城市| 新丰县| 错那县| 福建省| 黑水县| 敖汉旗| 柳河县|