Spring事件通知總結

Spring事件通知總結

參考:https://blog.csdn.net/likun557/article/details/106045522?utm_medium=distribute.pc_feed.none-task-blog-alirecmd-11.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-alirecmd-11.nonecase&request_id=

可以介紹一下爲什麼需要使用事件麼?

答:系統解耦,如果不考慮性能可以採用默認的同步本地事件監聽,也就是Spring ApplicationMulticaster. 也可以通過給ApplicationMulticaster設置executor線程池實現異步監聽。如果要考慮拓展性和可靠性以及分佈式等功能應該考慮採用消息中間件實現。

Spring事件的實現有幾種方式?

答:整體來說2種方式,第一種是通過接口的方式,第二種是在方法上使用註解的方式。通過接口實現,需要手動設置到ApplicationMulticaster消息廣播者中,如果是註解的方式則會自動在構建Bean的後置處理起PostProcessor進行註冊。

Spring中事件監聽器的處理是同步方式還是異步方式?

答:默認是同步在一個時間分發函數中循環同步執行,如果有給muticaster廣播器設置線程池,則會採用線程池異步分發通知。這樣設計的目的是爲了避免影響主業務的性能。

那spring中事件監聽器支持自定義順序麼?

答:可以通過Spring實現Ordered接口,或者給監聽回調加@Order註解,之後在執行監聽事件的時候就會按照Ordered順序調用。由於Ordered接口是作用於排序比較器Comparator,談不上最終的執行順序,因此要實現真正的同步順序執行,得確保Multicaster沒有啓用線程池,一旦啓用了線程池,也就是異步執行了,如此一來最終的執行順序將得不到保證(不受Ordered接口控制)

總結

Spring的事件通過相比我們自己按照監聽者模式的寫法,集成了Spring喜歡用的註解,這些註解耦合在了SpringBean的生命週期中,包括了@Evenlistener和@Ordered,

我們可以利用Spring類庫實現的抽象類自定義自己事件分發處理業務,免去了從頭做起,其他很多事件分發工具類庫也可以實現。

硬要說的話,就是我們可以很輕易把這些過程輕易得委託給Spring框架實現。他也遵循了從簡單到複雜的設計思路,比如默認可以是簡單單線程同步無序地分發。

也提供了線程池擴展口,給我們實現異步分發通知的可能(個人覺得事件大多都是非主要業務,應該是異步的場景多一點)

至於爲什麼說Spring事件分發器耦合了Spring框架呢?因爲所有事件通知組件,包括了廣播者,事件定義,監聽者都和Spring上下文ApplicationContext捆綁。應該說,只要和Spring有關的一些都是這樣。

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