本文是Spring系列文章的一部分。其他相关文章见
Spring系列文章导航
本文是监听器源码详解。
前言
一、监听器的相关类
1.事件
如图所示,Spring的事件机制中,最重要的四个事件必然是和容器生命周期相关的四个类。
在4.2之后,Spring引入了PayloadApplicationEvent 泛型类,可以用泛型类来包装其他类。
2.监听器
SmartApplicationListener
GenericApplicationListener
后者区别在于,supportsEventType方法中使用了ResolvableType。
//SmartApplicationListener
boolean supportsEventType(Class<? extends ApplicationEvent> eventType);
//GenericApplicationListener
boolean supportsEventType(ResolvableType eventType);
3.事件发布者
ApplicationEventPublisher
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
从源码可以发现,容器就是一个事件发布者。
ApplicationEventMulticaster
允许多线程执行的时间发布者
public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
Executor executor = getTaskExecutor();
for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
if (executor != null) {
executor.execute(() -> invokeListener(listener, event));
}
else {
invokeListener(listener, event);
}
}
}