通过SpringApplicationRunListeners的starting方法通知所有的SpringApplicationRunListener侦听器。该方法的定义为:
void starting(ConfigurableBootstrapContext bootstrapContext, Class<?> mainApplicationClass) {
// 通知所有的监听器
doWithListeners("spring.boot.application.starting",
// 遍历所有的监听器并执行
(listener) -> listener.starting(bootstrapContext),
// 在该步骤中添加标签
(step) -> {
if (mainApplicationClass != null) {
step.tag("mainApplicationClass", mainApplicationClass.getName());
}
});
}
这里可以看到该方法调用doWithListeners方法通知监听器处理相应的事件。
这里分析一下doWithListeners,该方法的定义为:
private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction,
Consumer<StartupStep> stepAction) {
// 创建新步骤并标记其开始。
StartupStep step = this.applicationStartup.start(stepName);
// 通知所有的事件侦听者
this.listeners.forEach(listenerAction);
// 在该步骤中打标签
if (stepAction != null) {
stepAction.accept(step);
}
// 标记该步骤结束,不能修改该步骤的状态
step.end();
}