这篇也是对prepareContext方法的补充,在执行完内置的ApplicationContextInitializer后,该方法发布了一个事件ApplicationContextInitializedEvent,在默认情况下,接收到事件的监听器有两个
BackgroundPreinitializer
public class BackgroundPreinitializer implements ApplicationListener<SpringApplicationEvent> {
......
......
public void onApplicationEvent(SpringApplicationEvent event) {
if (!Boolean.getBoolean("spring.backgroundpreinitializer.ignore") && event instanceof ApplicationStartingEvent && preinitializationStarted.compareAndSet(false, true)) {
this.performPreinitialization();
}
if ((event instanceof ApplicationReadyEvent || event instanceof ApplicationFailedEvent) && preinitializationStarted.get()) {
try {
preinitializationComplete.await();
} catch (InterruptedException var3) {
Thread.currentThread().interrupt();
}
}
}
这个监听器的泛型参数为SpringApplicationEvent,它是当前事件ApplicationContextInitializedEvent的父类,所以会传播到这个监听器中
但是看它的onApplicationEvent方法,只会处理ApplicationStartingEvent、ApplicationReadyEvent以及ApplicationFailedEvent等事件,并不会对当前事件做任何处理
我个人认为像这样目的性很明确的监听器,其实应该实现GenericApplicationListener接口,通过其supportsEventType方法明确指定要监听的事件类型,可以避免不必要的事件传播
DelegatingApplicationListener
public class DelegatingApplicationListener implements ApplicationListener<ApplicationEvent>, Ordered {
......
......
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
List<ApplicationListener<ApplicationEvent>> delegates = this.getListeners(((ApplicationEnvironmentPreparedEvent)event).getEnvironment());
if (delegates.isEmpty()) {
return;
}
this.multicaster = new SimpleApplicationEventMulticaster();
Iterator var3 = delegates.iterator();
while(var3.hasNext()) {
ApplicationListener<ApplicationEvent> listener = (ApplicationListener)var3.next();
this.multicaster.addApplicationListener(listener);
}
}
if (this.multicaster != null) {
this.multicaster.multicastEvent(event);
}
}
这个监听器在之前处理事件ApplicationEnvironmentPreparedEvent的时候,会看我们是否通过参数context.listener.classes配置了自定义的监听器,如果有的话就初始化一个事件发布器,将这些自定义监听器存储起来,这个逻辑之前的文章已经分析过了
所以它接收到该事件的作用,就是将事件广播到我们自定义的监听器中