SpringApplicationRunListeners 初始化
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting(bootstrapContext, this.mainApplicationClass);
本次主要分析这2行代码,从字面上理解应该是获取监听,以及初始化content的监听功能,接着看getRunListeners
private SpringApplicationRunListeners getRunListeners(String[] args) {
Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };
return new SpringApplicationRunListeners(logger,
getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args),
this.applicationStartup);
}
先看看new SpringApplicationRunListeners
中的getSpringFactoriesInstances
这个方法做了什么事情
其实上一章我们已经讲述过这个方法主要是获取对象的
getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args)
这个主要是看传入了什么接口,然后会从工map中获取对应有哪些实现,然后将这些实现一一启动
我从META-INF/spring.factories看到
# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener
很明显,Listener主要就是初始化这个监听器
从断点总看到,确实我我们猜测的一样,确实是这个类
找到这个类之后接下来就是启动这个监听了
我们在仔细的分析一下监听启动代码
void starting(ConfigurableBootstrapContext bootstrapContext, Class<?> mainApplicationClass) {
doWithListeners("spring.boot.application.starting", (listener) -> listener.starting(bootstrapContext),
(step) -> {
if (mainApplicationClass != null) {
step.tag("mainApplicationClass", mainApplicationClass.getName());
}
});
}
最终还是要看这个方法
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();
}
从debug的结果来看,这段代码会被执行多次
- 1 执行类:SpringApplicationRunListener
- 步骤名称:spring.boot.application.starting