SpringApplicationRunListener
SpringApplicationRunListener用于监听 SpringBoot 的整个生命周期,具体定义:
这些生命周期方法的调用全部都是在SpringApplication
里面的:
我们在程序中可以设置多个SpringApplicationRunListener
,有个专门的类来处理多个监听器:SpringApplicationRunListeners
。在程序启动的时候,SpringBoot会从META-INF/spring.factories文件中读取所有设置的SpringApplicationRunListener,然后由SpringApplicationRunListeners来统一管理。
我们自己定义的SpringApplicationRunListener有一个要求:必须包含两个参数分别为SpringApplication application
,String[] args
的构造方法!其中args参数就是SpringBoot启动是命令行传入的参数!
ApplicationListener
ApplicationListener也可用于SpringBoot生命周期的监听,但是它更通用,它还可以用于自定义事件的处理!先看定义:
ApplicationEvent
|
|------SpringApplicationEvent
| |----ApplicationEnvironmentPreparedEvent
| |----ApplicationPreparedEvent
| |----ApplicationStartedEvent
| |----ApplicationReadyEvent
| |----ApplicationFailedEvent
| |----ApplicationStartingEvent
|
|------ApplicationContextEvent
| |----ContextClosedEvent
| |----ContextRefreshedEvent
| |----ContextStoppedEvent
| |----ContextStartedEvent
|
.....
区别与联系
首先说说联系,SpringBoot定义了一个SpringApplicationRunListener的实现类:EventPublishingRunListener
,这个类的作用就是监听SpringBoot生命周期,并将生命周期变化事件发布到所有的ApplicationListener。
源码如下:
通过源码我们可以看出生命周期的对应关系:
- starting() <-> ApplicationStartingEvent
- environmentPrepared() <-> ApplicationEnvironmentPreparedEvent
- contextPrepared() <-> ApplicationContextInitializedEvent
- contextLoaded() <-> ApplicationPreparedEvent
- started() <-> ApplicationStartedEvent
- running() <-> ApplicationReadyEvent
- failed() <-> ApplicationFailedEvent
再来说下区别,SpringApplicationRunListener
是通过spring.factories方式进行加载的,而ApplicationListener
可以通过Bean直接被容器加载;其次,ApplicationListener
可以支持更多自定义事件的监听,不仅仅只有生命周期事件。
参考
Better application events in Spring Framework 4.2