从出现时间上看:
org.springframework.context.ApplicationListener,Spring 1.0开始出现
org.springframework.context.ApplicationContextInitializer,Spring 3.1开始出现
org.springframework.boot.SpringApplicationRunListener,Spring boot 1.0.0开始出现
org.springframework.boot.BootstrapRegistryInitializer,Spring boot2.4.5开始出现
从执行时间上看,先后顺序为:
BootstrapRegistryInitializer
SpringApplicationRunListener
ApplicationContextInitializer
ApplicationListener
从执行方式上看:
BootstrapRegistryInitializer的执行在run()方法中createBootstrapContext()方法中调用。
SpringApplicationRunListener的执行发生在run()方法中SpringApplicationRunListeners类手动调用。
ApplicationContextInitializer的执行发生在run()方法中的prepareContext()方法中。
ApplicationListener的执行发生在SpringApplicationRunListeners类手动调用时,会多次发生,由SpringApplicationRunListener的实现类EventPublishingRunListener去广播给ApplicationListener。
从作用上看:
BootstrapRegistryInitializer,没有自定义实现,
SpringApplicationRunListener,有大量自定义实现,分发时间触发ApplicationListener执行
ApplicationContextInitializer,有大量自定义实现,
ApplicationListener,有大量自定义实现,
设计分析
Spring时期,就有了 ApplicationListener这个监听器,用于给开发者扩展插件,它可以接受多个阶段的事件,开发者可以判断事件类型来决定是否要执行扩展逻辑。
在Spring boot中,通过SpringApplicationRunListeners这个控制类,来在不同阶段调用执行所有的SpringApplicationRunListener监听器,其中有个监听器EventPublishingRunListener,他能广播所有相关事件给ApplicationListener监听器。
事件的分类
org.springframework.context.ApplicationEvent,spring1.0出现的,是下面事件的父类
org.springframework.context.event.ApplicationContextEvent,是spring 2.5出现的
org.springframework.boot.context.event.SpringApplicationEvent,是spring boot 1.0.0出现的