日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Spring boot 注解@Async不生效 無效 不起作用

作者:Jothan Zhong 更新時間: 2024-01-14 編程語言

今天在做公司項目時,有一個發郵件的需求。所以寫了一個發送郵件的方法后來發現發郵件很慢,導致接口響應也很慢。于是我便想到要使用異步調用去處理這個方法。于是我把注解@Async 加到了自己service類下的一個發郵件的一個方法,后來發現并沒有生效。

?

調用處代碼:

我在以下兩個方法上都試過加上@Async注解 可是都并沒有生效

發送郵件代碼:

?

我思考了一下可能應該是因為aop代理的緣故,被調用方法 和 調用處的代碼都處在同一個類,所以只是相當于本類調用,并沒有使用代理類 從而@Async并沒有產生效果。

?

于是我查詢了一下資料,證實了我的想法,于是我把@Async 注解放到了工具類?MailService 下

?

修改了注解的添加位置后,接口調用明顯速度加快了,成功!

總結:

失效原因
1.@SpringBootApplication啟動類當中沒有添加@EnableAsync注解。
2.異步方法使用注解@Async的返回值只能為void或者Future。
3.沒有走Spring的代理類。因為@Transactional和@Async注解的實現都是基于Spring的AOP,而AOP的實現是基于動態代理模式實現的。那么注解失效的原因就很明顯了,有可能因為調用方法的是對象本身而不是代理對象,因為沒有經過Spring容器管理。

?

解決方法:
這里具體說一下第三種情況的解決方法。
1.注解的方法必須是public方法。
2.方法一定要從另一個類中調用,也就是從類的外部調用,類的內部調用是無效的。
3.如果需要從類的內部調用,需要先獲取其代理類。

?

原文鏈接:https://blog.csdn.net/qq_43985303/article/details/130765363

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新