Spring無法接收List<event>的解決方案
引言
在日常開發(fā)中,我們常使用 Spring 的 @EventListener
注解來監(jiān)聽事件。但在處理 批量事件 時,卻可能遇到一些“看似合理但無法生效”的監(jiān)聽方式。
本文以實際具體案例為出發(fā)點,結(jié)合源碼分析事件派發(fā)邏輯,并給出兩種可行解決方案,幫助你真正吃透 Spring 事件機制。
問題背景:監(jiān)聽 List<User> 無法生效
在UserService#save
方法中發(fā)送一個批量用戶事件:
希望在監(jiān)聽器中直接接收這批用戶:
但實際上,這個方法不會被觸發(fā)。
源碼剖析:Spring 是如何匹配監(jiān)聽器的?
通過上圖可知,獲取事件監(jiān)聽器是核心,其源碼如下:
在 Spring 中,@EventListener
注解的方法在容器啟動階段,會被 EventListenerMethodProcessor
掃描并封裝為 ApplicationListenerMethodAdapter
類型的監(jiān)聽器。匹配邏輯的關(guān)鍵如下所示:
解決方案
方法一:監(jiān)聽 PayloadApplicationEvent<List<User>>
這種寫法可以被正確識別為監(jiān)聽器,因為事件類型完全匹配。
方法二:自定義包裝類型
如果希望在業(yè)務(wù)中更明確事件語義,也可以自定義一個批量事件對象:
然后相應(yīng)地修改發(fā)布事件:
這種方式具有更好的可讀性和擴展性,推薦使用。
到此這篇關(guān)于Spring無法接收List<event>;的解決方案的文章就介紹到這了,更多相關(guān)Spring無法接收List<event>;內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式
這篇文章主要介紹了使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot如何使用RateLimiter通過AOP方式進(jìn)行限流
這篇文章主要介紹了SpringBoot如何使用RateLimiter通過AOP方式進(jìn)行限流,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06詳解SpringCloud Finchley Gateway 統(tǒng)一異常處理
這篇文章主要介紹了詳解SpringCloud Finchley Gateway 統(tǒng)一異常處理,非常具有實用價值,需要的朋友可以參考下2018-10-10springmvc級聯(lián)屬性處理無法轉(zhuǎn)換異常問題解決
這篇文章主要介紹了springmvc級聯(lián)屬性處理無法轉(zhuǎn)換異常問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12