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

今天在做公司項目時,有一個發郵件的需求。所以寫了一個發送郵件的方法後來發現發郵件很慢,導致接口響應也很慢。於是我便想到要使用異步調用去處理這個方法。於是我把註解@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/YoungLee16/article/details/88398045

https://blog.csdn.net/QYHuiiQ/article/details/85014983

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章