Spring的異步任務註解@Async

1.@Async的使用

  在Spring中,基於@Async標註的方法,稱之爲異步方法;這些方法將在執行的時候,將會在獨立的線程中被執行,調用者無需等待它的完成,即可繼續其他的操作。分爲不帶參數的異步調用;帶參數的異步調用;調用返回Future的異步線程

異步方法示例,關鍵點有三步:

  •  1.啓動類增加註解 @EnableAsync 
  • 2.當前類聲明爲服務 @Service 
  • 3.方法上面添加註解 @Async

2.限制

  •  @Async所修飾的函數不要定義爲static類型,這樣異步調用不會生效。
  • 默認類內的方法調用不會被aop攔截,也就是說同一個類內的方法調用,@Async不生效
  • 默認情況下異步方法的調用使用的是SimpleAsyncTaskExecutor來執行異步方法調用,實際是每個方法都會起一個新的線程。

 一般會添加一個線程池的配置,不影響主線程,異步方法交給單獨的線程完成

3.所遇到的問題

   使用@Async調通之後可能之前的代碼會產生循環依賴的問題,具體情況是編譯報錯:

  cnsider using 'getBeanNamesOfType' withthe 'allowEagerInit' flag turned off, for example.

  解決辦法:

1.使用 @Lazy 或者 @ComponentScan(lazyInit = true) 來解決該問題,經過我實驗,@Lazy必須和@Autowired聯合使用才能生效,單純在類上添加 @Lazy 並無意義。

 

 2.使用基於 Setter 的注入

 

3.使用@Autowired註解防止循環注入,如:

4.將業務邏輯分離出來,避免出現循環依賴

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