最新国产好看的视频,伊人天堂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());
    }
  }

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

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

打斷點吧,如下:

在這里插入圖片描述

是使用cglib生成的代理對象,沒有問題啊,到底問題在哪里。沒辦法,面向百度編程吧,還真找到問題解決辦法。如下帖子:http://www.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)文章

  • SpringBoot java-jar命令行啟動原理解析

    SpringBoot java-jar命令行啟動原理解析

    這篇文章主要介紹了SpringBoot java-jar命令行啟動原理解析,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Spring Boot中Bean定義方調(diào)用方式解析

    Spring Boot中Bean定義方調(diào)用方式解析

    這篇文章主要介紹了Spring Boot中Bean定義方調(diào)用方式解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 深入淺析JDK8新特性之Lambda表達式

    深入淺析JDK8新特性之Lambda表達式

    Lambda表達式主要是替換了原有匿名內(nèi)部類的寫法,也就是簡化了匿名內(nèi)部類的寫法。這篇文章主要介紹了JDK8新特性之Lambda表達式,非常不錯感興趣的朋友參考下吧
    2016-10-10
  • Java中指定時區(qū)的3種方法

    Java中指定時區(qū)的3種方法

    這篇文章主要介紹了Java中指定時區(qū)的3種方法,本文是一個JAVA項目和.NET項目通訊時遇到的問題,本文給出JAVA中的3種解決方法,需要的朋友可以參考下
    2015-02-02
  • Java SpringBoot微服務(wù)框架驗證碼報錯問題解決方案

    Java SpringBoot微服務(wù)框架驗證碼報錯問題解決方案

    這篇文章主要介紹了Java SpringBoot微服務(wù)框架驗證碼報錯問題解決方案,包括dockerfile容器操作和完整dockerfile,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • java實現(xiàn)音樂播放器完整代碼(調(diào)整顯示音量大小、調(diào)整進度、圖片切換)

    java實現(xiàn)音樂播放器完整代碼(調(diào)整顯示音量大小、調(diào)整進度、圖片切換)

    這篇文章主要給大家介紹了關(guān)于java實現(xiàn)音樂播放器(調(diào)整顯示音量大小、調(diào)整進度、圖片切換)的相關(guān)資料,這本身是老師布置的一個作業(yè),寫完感覺不錯分享給大家,需要的朋友可以參考下
    2023-07-07
  • 詳解Java的Struts2框架的結(jié)構(gòu)及其數(shù)據(jù)轉(zhuǎn)移方式

    詳解Java的Struts2框架的結(jié)構(gòu)及其數(shù)據(jù)轉(zhuǎn)移方式

    這篇文章主要介紹了詳解Java的Struts2框架的結(jié)構(gòu)及其數(shù)據(jù)轉(zhuǎn)移方式,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2016-01-01
  • Spring session實現(xiàn)Session共享

    Spring session實現(xiàn)Session共享

    本文主要介紹了Spring session實現(xiàn)Session共享,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • java解決動態(tài)配置字段需求問題

    java解決動態(tài)配置字段需求問題

    這篇文章主要介紹了java解決動態(tài)配置字段需求問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • SpringMVC文件上傳及查看的示例代碼

    SpringMVC文件上傳及查看的示例代碼

    本篇文章主要介紹了SpringMVC文件上傳及查看的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01

最新評論

安康市| 和硕县| 津市市| 吴川市| 乌兰察布市| 青铜峡市| 建德市| 平陆县| 商都县| 文山县| 米泉市| 灌阳县| 油尖旺区| 九江县| 滁州市| 昔阳县| 措勤县| 马公市| 安西县| 含山县| 赞皇县| 营山县| 项城市| 安康市| 桂东县| 邮箱| 宝兴县| 监利县| 乌兰浩特市| 肥东县| 丰宁| 年辖:市辖区| 双辽市| 咸宁市| 林芝县| 正镶白旗| 贺州市| 福贡县| 香河县| 奉新县| 酒泉市|