精品課程網(wǎng)站設計建站優(yōu)化
目錄
事件基類定義
事件監(jiān)聽器接口
事件發(fā)布者接口及實現(xiàn)
事件廣播器實現(xiàn)
小小總結(jié)
Spring源碼分析之事件機制——觀察者模式(一)-CSDN博客
Spring源碼分析之事件機制——觀察者模式(二)-CSDN博客
Spring源碼分析之事件機制——觀察者模式(三)-CSDN博客
這兩篇文章是這個篇章的后篇,感興趣的讀者可以閱讀一下,從spring源碼分析觀察者模式
事件基類定義
public abstract class ApplicationEvent extends EventObject {// 事件發(fā)生的時間戳private final long timestamp;public ApplicationEvent(Object source) {// source表示事件源,即發(fā)布事件的對象super(source);this.timestamp = System.currentTimeMillis();}// 獲取事件發(fā)生時間public final long getTimestamp() {return this.timestamp;}
}
ApplicationEvent作為所有Spring事件的基類,繼承自Java的EventObject,通過記錄時間戳和事件源,為事件提供了基本的元數(shù)據(jù)信息,使得事件能夠攜帶更多的上下文信息。
事件監(jiān)聽器接口
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {/*** 處理應用事件的方法* @param event 要響應的事件*/void onApplicationEvent(E event);
}
ApplicationListener接口定義了事件監(jiān)聽器的標準,通過泛型約束限定了具體監(jiān)聽的事件類型,使得監(jiān)聽器能夠只關注特定類型的事件,我覺得spring的這種設計既保證了類型安全,又提供了良好的擴展性。
事件發(fā)布者接口及實現(xiàn)
@FunctionalInterface
public interface ApplicationEventPublisher {/*** 發(fā)布事件的方法* @param event 要發(fā)布的事件*/default void publishEvent(ApplicationEvent event) {publishEvent((Object) event);}/*** 發(fā)布任意對象作為事件* @param event 要發(fā)布的事件對象*/void publishEvent(Object event);
}
public abstract class AbstractApplicationContext implements ApplicationEventPublisher {// 事件廣播器private ApplicationEventMulticaster applicationEventMulticaster;// 早期事件緩存,用于存儲容器未完全初始化前的事件private Set<ApplicationEvent> earlyApplicationEvents;@Overridepublic void publishEvent(Object event) {// 確保事件對象是ApplicationEvent類型ApplicationEvent applicationEvent;if (event instanceof ApplicationEvent) {applicationEvent = (ApplicationEvent) event;} else {// 將普通對象包裝為PayloadApplicationEventapplicationEvent = new PayloadApplicationEvent<>(this, event);}// 如果容器還在初始化,則將事件添加到早期事件集合if (this.earlyApplicationEvents != null) {this.earlyApplicationEvents.add(applicationEvent);} else {// 通過事件廣播器發(fā)布事件getApplicationEventMulticaster().multicastEvent(applicationEvent);}// 如果存在父容器,則同時發(fā)布到父容器if (this.parent != null) {this.parent.publishEvent(event);}}// 初始化事件廣播器protected void initApplicationEventMulticaster() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();// 如果容器中已定義了廣播器,則使用已定義的if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);} else {// 否則創(chuàng)建一個簡單的事件廣播器this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);}}
}
AbstractApplicationContext實現(xiàn)了事件發(fā)布的核心邏輯,通過事件廣播器將事件分發(fā)給所有相關的監(jiān)聽器,同時處理了事件的向上傳播和早期事件的緩存。
事件廣播器實現(xiàn)
public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {// 任務執(zhí)行器,用于異步事件處理@Nullableprivate Executor taskExecutor;// 錯誤處理器@Nullableprivate ErrorHandler errorHandler;@Overridepublic void multicastEvent(ApplicationEvent event) {// 解析事件類型并廣播multicastEvent(event, resolveDefaultEventType(event));}@Overridepublic void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {// 解析事件類型ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));// 獲取所有匹配的監(jiān)聽器并執(zhí)行for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {Executor executor = getTaskExecutor();if (executor != null) {// 異步執(zhí)行executor.execute(() -> invokeListener(listener, event));} else {// 同步執(zhí)行invokeListener(listener, event);}}}protected void invokeListener(ApplicationListener<?> listener, ApplicationEvent event) {ErrorHandler errorHandler = getErrorHandler();if (errorHandler != null) {try {doInvokeListener(listener, event);} catch (Throwable err) {errorHandler.handleError(err);}} else {doInvokeListener(listener, event);}}
}
SimpleApplicationEventMulticaster提供了事件廣播的具體實現(xiàn),支持同步和異步兩種事件處理方式,并提供了錯誤處理機制,通過這種設計,使得事件的處理更加靈活和可靠,同時也為性能優(yōu)化提供了可能。
小小總結(jié)
Spring的事件機制通過這些精心設計的組件,構(gòu)建了一個完整的觀察者模式實現(xiàn),它不僅支持Spring框架內(nèi)部的事件處理,也為應用程序提供了一個強大的事件驅(qū)動架構(gòu)基礎,通過這種方式,可以實現(xiàn)組件間的松耦合通信,提高系統(tǒng)的可維護性和擴展性。整個實現(xiàn)考慮了性能、可靠性和易用性等多個方面,是一個非常典型的觀察者模式應用案例。