Async失效及Spring迴圈依賴報錯問題分析

2021-10-25 11:36:33 字數 891 閱讀 7096

今日寫**發現了@async註解的方法放在@service的類中,不能非同步執行。於是排查找了下原因。我是直接在類中定義了乙個非同步方法。然後直接在該類中的其他方法呼叫。

跟spring註冊bean的過程有很大關係,首先呼叫這個方法如果不是靜態類的,肯定是有個隱式物件去呼叫。在這個類中(命名為a,例項物件為a)。則應該是a.issuerecharge()方法呼叫,這裡的a其實就是spring管理的乙個bean。相當於a類在spring容器初始化載入在設定屬性是要把a設定進去,自己依賴自己就是迴圈依賴。在依賴的過程中,像@async,@transation都是基於動態**實現的。在例項化時第一次例項a,應該已經在3級快取中已存在。但沒產出最終的原始物件。在進行動態**例項**物件時,發現容器已經暴露了例項a的乙個物件。那麼這個**物件就會建立不成功。最終拿到的a就是a的原始物件,所以@async修飾的方法相當於乙個普通方法,用的是a的原始物件。沒有被spring**去管控。

將這種非同步方法封裝成乙個新的類。重新作為乙個bean進行管理。

改造封裝成b類後再進行依賴注入,此時應該是

a{b b;}b

發現這時出現了迴圈依賴的報錯。按理說是spring是通過**快取預設解決了這類問題。出現問題的原因還是關於**物件的建立。非最終版本的classa被注入到了迴圈依賴的classb

。所以當出現動態**而又出現迴圈依賴的時候,要注意這種情況。通過懶載入方法例項化

bean,在乙個完成例項註冊成功就會去拿到最終版本的bean。

在引入的bean加上@lazy註解

spring 非同步處理 Async

最近剛要用到非同步處理小結一下 非同步執行 所謂非同步,就是當執行a方法的過程中呼叫b方法,但是b方法並不影響a方法的執行效率,即使b方法沒有執行結束還是會正常執行a方法。簡單說非同步執行就是先返回結果,再執行過程 或者 當執行a方法的過程中,只用滿足某個條件是才會執行b方法,但是b方法的成功和失敗...

Spring非同步方法註解 Async

spring 配置檔案增加以下配置 注意點 在同乙個類中 乙個方法呼叫另外乙個有註解 比如 async,transational 的方法,註解是不會生效的。在呼叫 async方法的類後面新增註解 enableasync 在被呼叫的方法增加 async註解 呼叫和被呼叫,不能在乙個類裡面定義,要分開定...

spring事務失效

遇到的問題 前端時間我在做乙個父子事務巢狀的時候,出現了子事務失效。在同類的子事務上加事務註解一直都不能建立事務,後來發現是子事務失效了。下面總結一下事務失效情況和解決經驗 事務失效有如下幾種情況 沒有transaction註解 事務沒有丟擲runtimeexception異常到方法上 方法內丟擲r...