SpringApplicationRunListener接口定义如下:
public interface SpringApplicationRunListener {
default void starting() {
}
default void environmentPrepared(ConfigurableEnvironment environment) {
}
default void contextPrepared(ConfigurableApplicationContext context) {
}
default void contextLoaded(ConfigurableApplicationContext context) {
}
default void started(ConfigurableApplicationContext context) {
}
default void running(ConfigurableApplicationContext context) {
}
default void failed(ConfigurableApplicationContext context, Throwable exception) {
}
}
SpringApplicationRunListeners中定义了一个成员变量:
SpringApplication的静态run方法包含如下代码:
其中调用的getRunListeners代码如下:
可以看到,它通过getSpringFactoriesInstances方法获取到SpringApplicationRunListener的collection,然后把它传递给SpringApplicationListeners的构造方法,然后将创建的SpriongApplicationRunListeners对象返回。
在SpringApplication的run方法的不同阶段,分别会调用SpringApplicationRunListeners对象的不同方法,比如
这里调用了listeners的environmentPrepared方法,而listeners的相关方法里会遍历其所封装的listener,然后调用对应的listener的方法:
或
这是观察者模式的典型应用。
SpringApplicationRunListener有一个唯一的实现类EventPulishingRunListener
当事件发生时,它通过SimpleApplicationEventMulticaster类型的成员变量initialMulticaster来发布事件: