Spring無(wú)法接收List<event>的解決方案
引言
在日常開(kāi)發(fā)中,我們常使用 Spring 的 @EventListener 注解來(lái)監(jiān)聽(tīng)事件。但在處理 批量事件 時(shí),卻可能遇到一些“看似合理但無(wú)法生效”的監(jiān)聽(tīng)方式。
本文以實(shí)際具體案例為出發(fā)點(diǎn),結(jié)合源碼分析事件派發(fā)邏輯,并給出兩種可行解決方案,幫助你真正吃透 Spring 事件機(jī)制。
問(wèn)題背景:監(jiān)聽(tīng) List<User> 無(wú)法生效
在UserService#save 方法中發(fā)送一個(gè)批量用戶(hù)事件:

希望在監(jiān)聽(tīng)器中直接接收這批用戶(hù):

但實(shí)際上,這個(gè)方法不會(huì)被觸發(fā)。
源碼剖析:Spring 是如何匹配監(jiān)聽(tīng)器的?

通過(guò)上圖可知,獲取事件監(jiān)聽(tīng)器是核心,其源碼如下:

在 Spring 中,@EventListener 注解的方法在容器啟動(dòng)階段,會(huì)被 EventListenerMethodProcessor 掃描并封裝為 ApplicationListenerMethodAdapter 類(lèi)型的監(jiān)聽(tīng)器。匹配邏輯的關(guān)鍵如下所示:

解決方案
方法一:監(jiān)聽(tīng) PayloadApplicationEvent<List<User>>

這種寫(xiě)法可以被正確識(shí)別為監(jiān)聽(tīng)器,因?yàn)槭录?lèi)型完全匹配。
方法二:自定義包裝類(lèi)型
如果希望在業(yè)務(wù)中更明確事件語(yǔ)義,也可以自定義一個(gè)批量事件對(duì)象:

然后相應(yīng)地修改發(fā)布事件:

這種方式具有更好的可讀性和擴(kuò)展性,推薦使用。
到此這篇關(guān)于Spring無(wú)法接收List<event>;的解決方案的文章就介紹到這了,更多相關(guān)Spring無(wú)法接收List<event>;內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中ReentrantLock4種常見(jiàn)的坑
本文主要介紹了Java中ReentrantLock?4種常見(jiàn)的坑,ReentrantLock默認(rèn)情況下為非公平鎖,下文關(guān)于其更多詳情需要的小伙伴可以參考一下2022-05-05
使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式
這篇文章主要介紹了使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
MyBatis接口綁定的實(shí)現(xiàn)方式和工作原理
在日常開(kāi)發(fā)中,數(shù)據(jù)持久層是幾乎每個(gè)項(xiàng)目都會(huì)涉及的一個(gè)關(guān)鍵組成部分,MyBatis作為一個(gè)流行的持久層框架,其提供的接口綁定機(jī)制極大地簡(jiǎn)化了數(shù)據(jù)庫(kù)操作,本文將通過(guò)詳細(xì)的代碼示例和講解,帶你深入理解MyBatis接口綁定的工作原理和實(shí)踐方式,需要的朋友可以參考下2024-03-03
SpringMVC詳解如何映射請(qǐng)求數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于SpringMvc映射請(qǐng)求數(shù)據(jù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-06-06
java程序員必會(huì)的遠(yuǎn)程debug教程
這篇文章主要為大家介紹了java程序員必會(huì)的遠(yuǎn)程debug教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
SpringBoot如何使用RateLimiter通過(guò)AOP方式進(jìn)行限流
這篇文章主要介紹了SpringBoot如何使用RateLimiter通過(guò)AOP方式進(jìn)行限流,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
詳解SpringCloud Finchley Gateway 統(tǒng)一異常處理
這篇文章主要介紹了詳解SpringCloud Finchley Gateway 統(tǒng)一異常處理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
SpringBoot發(fā)送html郵箱驗(yàn)證碼功能
這篇文章主要介紹了SpringBoot發(fā)送html郵箱驗(yàn)證碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
springmvc級(jí)聯(lián)屬性處理無(wú)法轉(zhuǎn)換異常問(wèn)題解決
這篇文章主要介紹了springmvc級(jí)聯(lián)屬性處理無(wú)法轉(zhuǎn)換異常問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

