SpringBoot源码解析(十六)ApplicationContextInitializedEvent

这篇也是对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配置了自定义的监听器,如果有的话就初始化一个事件发布器,将这些自定义监听器存储起来,这个逻辑之前的文章已经分析过了

所以它接收到该事件的作用,就是将事件广播到我们自定义的监听器中

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值