javascript
Spring5源码 - 10 Spring事件监听机制_应用篇
文章目錄
- Spring事件概覽
- 事件
- 自定義事件
- 事件監聽器
- 基于接口
- 基于注解
- 事件廣播器
Spring事件概覽
Spring事件體系包括三個組件:事件,事件監聽器,事件廣播器
事件
Spring的內置事件中由系統內部進行發布,只需注入監聽器
- ContextRefreshedEvent
當容器被實例化或refreshed時發布.如調用refresh()方法, 此處的實例化是指所有的bean都已被加載,后置處理器都被激活,所有單例bean都已被實例化, 所有的容器對象都已準備好可使用. 如果容器支持熱重載,則refresh可以被觸發多次(XmlWebApplicatonContext支持熱刷新,而 GenericApplicationContext則不支持)
- ContextStartedEvent
當容器啟動時發布,即調用start()方法, 已啟用意味著所有的Lifecycle bean都已顯式接收到了start 信號
- ContextStoppedEvent
當容器停止時發布,即調用stop()方法, 即所有的Lifecycle bean都已顯式接收到了stop信號 , 關閉的容器可以通過start()方法重啟
- ContextClosedEvent
當容器關閉時發布,即調用close方法, 關閉意味著所有的單例bean都已被銷毀.關閉的容器不能被重啟或refresh
23歲的程序猿大爺都說了,讓整個小demo , 那來吧
先貼個配置類
package com.artisan.eventlistener2;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;@Configuration @ComponentScan("com.artisan.eventlistener2") public class ArtisanConfig {}自定義事件
事件類需要繼承ApplicationEvent
package com.artisan.eventlistener2;import org.springframework.context.ApplicationEvent;public class ArtisanEvent extends ApplicationEvent {private String msg ;public ArtisanEvent(Object source) {super(source);}public ArtisanEvent(Object source,String msg) {super(source);this.msg = msg ;}public void print(){System.out.println(msg);}}作為測試,使用一個簡單的pojo
事件監聽器
下面演示兩種方式
基于接口
package com.artisan.eventlistener2;import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component;@Component public class ArtisanListener implements ApplicationListener<ArtisanEvent> {@Overridepublic void onApplicationEvent(ArtisanEvent event) {System.out.println("實現ApplicationListener 監聽到ArtisanEvent.....");event.print();} }基于注解
package com.artisan.eventlistener2;import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component;@Component public class ArtisanListenerByAnno {@EventListener(ArtisanEvent.class)public void onApplicationEvent(ArtisanEvent event) {System.out.println("EventListener 監聽到ArtisanEvent.....");event.print();} }@EventListener,修飾在方法上,是不是比基于實現類的方式要好,不用一個事件一個類了,確實如此。
事件廣播器
package com.artisan.eventlistener2;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ArtisanTest {public static void main(String[] args) {AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ArtisanConfig.class);ac.publishEvent(new ArtisanEvent("xxxx","msg from artisanEvent"));} }核心就是ac.publishEvent
ac.publishEvent(new ArtisanEvent("xxxx","msg from artisanEvent"));【測試結果】
是不是發現,這不就是【觀察者模式】嗎? ----------確實確實,這就是觀察者模式的典型應用,那spring是怎么實現的呢?
下篇我們繼續分析Spring的源碼實現
總結
以上是生活随笔為你收集整理的Spring5源码 - 10 Spring事件监听机制_应用篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小工匠聊架构 - 如何优雅的做系统架构设
- 下一篇: Spring5源码 - 11 Sprin