SpringBoot事件發佈和監聽詳解
概述
ApplicationEvent以及Listener是Spring為我們提供的一個事件監聽、訂閱的實現,內部實現原理是觀察者設計模式,設計初衷也是為瞭系統業務邏輯之間的解耦,提高可擴展性以及可維護性。事件發佈者並不需要考慮誰去監聽,監聽具體的實現內容是什麼,發佈者的工作隻是為瞭發佈事件而已。事件監聽的作用與消息隊列有一點類似。
事件監聽的結構
主要有三個部分組成:
- 發佈者Publisher
- 事件Event
- 監聽者Listener
Publisher,Event和Listener的關系
事件
我們自定義事件MyTestEvent繼承瞭ApplicationEvent,繼承後必須重載構造函數,構造函數的參數可以任意指定,其中source參數指的是發生事件的對象,一般我們在發佈事件時使用的是this關鍵字代替本類對象,而user參數是我們自定義的註冊用戶對象,該對象可以在監聽內被獲取。
@Getter public class MyTestEvent extends ApplicationEvent { private static final long serialVersionUID = 1L; private User user; public MyTestEvent(Object source, User user) { super(source); this.user = user; } }
發佈者
事件發佈是由ApplicationContext對象管控的,我們發佈事件前需要註入ApplicationContext對象調用publishEvent方法完成事件發佈。
ApplicationEventPublisher applicationEventPublisher 雖然聲明的是ApplicationEventPublisher,但是實際註入的是applicationContext
@RestController @RequestMapping("/test") public class TestController { @Autowired ApplicationContext applicationContext; @Autowired ApplicationEventPublisher applicationEventPublisher; @GetMapping("testEvent") public void test() { applicationEventPublisher.publishEvent(new MyTestEvent("dzf-casfd-111", new User("dzf-625096527-111", "xiaoming", 19))); applicationEventPublisher.publishEvent(new MyTestEvent("dzf-49687489-111", new User("dzf-625096527-111", "xiaowang", 20))); } }
監聽者
面向接口編程,實現ApplicationListener接口
@Component public class MyTestListener implements ApplicationListener<MyTestEvent> { @Override public void onApplicationEvent(MyTestEvent myTestEvent) { System.out.println("MyTestListener : " + myTestEvent.getUser()); } }
使用@EventListener註解配置
@Component public class MyTestListener2{ @EventListener(MyTestEvent.class) public void onApplicationEvent(MyTestEvent myTestEvent) { System.out.println("MyTestListener2:" + myTestEvent.getUser()); } }
總結
到此這篇關於SpringBoot事件發佈和監聽的文章就介紹到這瞭,更多相關SpringBoot事件發佈和監聽內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot中ApplicationEvent和ApplicationListener用法小結
- Spring的事件機制知識點詳解及實例分析
- java和Spring中觀察者模式的應用詳解
- 詳解Spring事件發佈與監聽機制
- springboot如何開啟一個監聽線程執行任務