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

解決@Around對(duì)靜態(tài)方法不生效的問(wèn)題

 更新時(shí)間:2021年02月19日 11:07:19   作者:油頭怪  
這篇文章主要介紹了解決@Around對(duì)靜態(tài)方法不生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

場(chǎng)景:

在處理定時(shí)任務(wù)時(shí),由于這幾個(gè)方法都是靜態(tài)方法,在aop的切面中使用@Around注解,進(jìn)行監(jiān)控方法調(diào)用是否有異常。

發(fā)現(xiàn)aop沒(méi)有生效。

代碼如下:

/*切面類*/
@Aspect
@Component
public class RetryAop {
 private static Logger logger = LoggerFactory.getLogger(RetryAop.class);
 @Around(value = "@annotation(TechlogRetry)")
 public Object monitorAround(ProceedingJoinPoint pjp) throws Throwable {
 }
}
/*對(duì)應(yīng)的注解,在需要的方法上進(jìn)行標(biāo)注*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TechlogRetry {
 long waitMsec() default 0;
 Class[] retryThrowable() default {};
}
/*對(duì)應(yīng)的測(cè)試方法*/
@Component
@EnableScheduling
public class TimerWork {
 // 成員方法可以成功調(diào)用
 @Scheduled(cron = "*/5 * * * * ?")
 @TechlogRetry(waitMsec = 3000,retryThrowable = Exception.class)
 public void work1() {
  System.out.println("定時(shí)方法1.。。。。。。");
  throw new NullPointerException("拋出異常");
 }
  // 靜態(tài)方法不會(huì)進(jìn)行重試
	@Scheduled(cron = "*/5 * * * * ?")
 @TechlogRetry(waitMsec = 3000,retryThrowable = Exception.class)
 public static void work2() {
  System.out.println("定時(shí)方法2.。。。。。。");
  throw new NullPointerException("拋出異常");
 }
 // 通過(guò)這種方式生效
 @Scheduled(cron = "*/5 * * * * ?")
 @TechlogRetry(waitMsec = 3000,retryThrowable = Exception.class)
 public void work4() {
  System.out.println("這是work4.。。。");
  TimerWork.work2();// 調(diào)用work2時(shí),注釋掉方法2上面的相關(guān)注解
 }
 
}

產(chǎn)生原因:

可能是由于靜態(tài)方法是屬于類的,而非靜態(tài)方法是屬于Bean的,該類會(huì)被加載到容器中。具體原因需要查資料,后續(xù)進(jìn)行補(bǔ)充。

解決:

如work4,把你需要調(diào)用的靜態(tài)方法放到非靜態(tài)方法中進(jìn)行調(diào)用。

補(bǔ)充:記錄一次@Around使用不正確造成的StackOverflowError

同事發(fā)了一個(gè)底層服務(wù)后。我負(fù)責(zé)的某個(gè)上層服務(wù)突然掛了,有點(diǎn)慌,馬上查看上層服務(wù)的日志。

查看日志特別長(zhǎng)。沒(méi)找到從哪兒報(bào)的。

跳到最上開(kāi)始找,結(jié)果: StackOverflowError。就想到了遞歸調(diào)用。

隨即找到相關(guān)代碼一看:

由于doSomething方法也被@Around攔截,因此,一旦service下某個(gè)方法被攔截進(jìn)入doAround,就會(huì)調(diào)用other.doSomething(),就又會(huì)觸發(fā)doAround

導(dǎo)致一直遞歸調(diào)用且無(wú)法退出。

解決:

在@Around攔截的時(shí)候, 排除掉doSomething方法即可解決。

ps: @Around中不要用到被攔截方法。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • spring boot如何添加攔截器

    spring boot如何添加攔截器

    本篇文章主要介紹了spring boot如何添加攔截器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • java實(shí)現(xiàn)文件復(fù)制、剪切文件和刪除示例

    java實(shí)現(xiàn)文件復(fù)制、剪切文件和刪除示例

    這篇文章主要介紹了java實(shí)現(xiàn)文件復(fù)制、剪切文件和刪除示例,需要的朋友可以參考下
    2014-04-04
  • 詳解Spring Boot 配置加載順序及屬性加載順序

    詳解Spring Boot 配置加載順序及屬性加載順序

    這篇文章主要介紹了詳解Spring Boot 配置加載順序及屬性加載順序,本章內(nèi)容基于 Spring Boot 2.0 進(jìn)行詳解,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-08-08
  • Java簡(jiǎn)易學(xué)生成績(jī)系統(tǒng)寫(xiě)法實(shí)例

    Java簡(jiǎn)易學(xué)生成績(jī)系統(tǒng)寫(xiě)法實(shí)例

    在本篇文章里小編給大家分享的是關(guān)于Java簡(jiǎn)易學(xué)生成績(jī)系統(tǒng)寫(xiě)法實(shí)例以及相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。
    2019-09-09
  • SpringBoot中的@Import注解四種使用方式詳解

    SpringBoot中的@Import注解四種使用方式詳解

    這篇文章主要介紹了SpringBoot中的@Import注解四種使用方式詳解,@Import注解只可以標(biāo)注在類上,可以結(jié)合 @Configuration注解、ImportSelector、ImportBeanDefinitionRegistrar一起使用,也可以導(dǎo)入普通的類,需要的朋友可以參考下
    2023-12-12
  • 基于Java SSM實(shí)現(xiàn)Excel數(shù)據(jù)批量導(dǎo)入

    基于Java SSM實(shí)現(xiàn)Excel數(shù)據(jù)批量導(dǎo)入

    這篇文章主要為大家詳細(xì)介紹了基于Java SSM如何實(shí)現(xiàn)excel數(shù)據(jù)批量導(dǎo)入,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Spring定時(shí)任務(wù)注解@Scheduled詳解

    Spring定時(shí)任務(wù)注解@Scheduled詳解

    這篇文章主要介紹了Spring定時(shí)任務(wù)注解@Scheduled詳解,@Scheduled注解是包org.springframework.scheduling.annotation中的一個(gè)注解,主要是用來(lái)開(kāi)啟定時(shí)任務(wù),本文提供了部分實(shí)現(xiàn)代碼與思路,需要的朋友可以參考下
    2023-09-09
  • JDBC的擴(kuò)展知識(shí)點(diǎn)總結(jié)

    JDBC的擴(kuò)展知識(shí)點(diǎn)總結(jié)

    這篇文章主要介紹了JDBC的擴(kuò)展知識(shí)點(diǎn)總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)JDBC的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java線程間通訊的幾種方法小結(jié)

    Java線程間通訊的幾種方法小結(jié)

    線程通信可以用于控制并發(fā)線程的數(shù)量,本文主要介紹了Java線程間通訊的幾種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • MybatisPlus中的save方法詳解

    MybatisPlus中的save方法詳解

    save方法是Mybatis-plus框架提供的一個(gè)添加記錄的方法,它用于將一個(gè)實(shí)體對(duì)象插入到數(shù)據(jù)庫(kù)表中,這篇文章主要介紹了MybatisPlus中的save方法,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

荃湾区| 瓮安县| 兴山县| 南木林县| 前郭尔| 北宁市| 大名县| 建德市| 若羌县| 新绛县| 天等县| 南木林县| 乡城县| 太湖县| 大荔县| 永丰县| 通化市| 固始县| 岚皋县| 凉山| 岳阳县| 兰溪市| 鹤峰县| 桐城市| 得荣县| 穆棱市| 米泉市| 姜堰市| 尼玛县| 德阳市| 杭州市| 五莲县| 额敏县| 常州市| 无棣县| 麻江县| 涿鹿县| 民丰县| 柳州市| 贵溪市| 安义县|