SpringBoot版本:2.1.1 ==》启动流程分析汇总
目录
1、getRunListeners(String[] args)
1.1、SpringApplicationRunListener接口
1.2、创建SpringApplicationRunListeners对象
2、发布ApplicationStartingEvent事件
流程分析
SpringApplication对象创建好以后紧接着就是调用run()方法。
public ConfigurableApplicationContext run(String... args) {
//StopWatch是org.springframework.util的工具类,可以用来方便的记录程序的运行时间
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
//设置系统属性java.awt.headless为true
configureHeadlessProperty();
//从META-INF/spring.factories文件中得到SpringApplicationRunListeners接口的所有实现类实例集合
//然后通过构造方法创建SpringApplicationRunListeners对象。参数就是获取到的接口实现类集合
//该对象持有一个SpringApplicationRunListener对象的集合,并且封装了SpringApplicationRunListener接口对应的方法,方便统一管理Listener
SpringApplicationRunListeners listeners = getRunListeners(args);
//广播事件ApplicationStartingEvent
listeners.starting();
//本篇内容记录到这,后续更新
.....
}
1、getRunListeners(String[] args)
是不是看到一个面熟的方法getSpringFactoriesInstances(不知道方法作用的看上篇博客),不过这次传的就不是空的Class数组了,传的数组包括SpingApplication.class和String.class。即在创建SpringApplicationRunListener接口实现类对象的时候调用的构造方法是指定了参数类型的,为types数组中的参数类型,然后还有SpringApplication和args,这两个想的到就是构造方法的参数了。
private SpringApplicationRunListeners getRunListeners(String[] args) {
Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };
return new SpringApplicationRunListeners(logger, getSpringFactoriesInstances(
SpringApplicationRunListener.class, types, this, args));
}
注意:SpringApplicationRunListeners类和SpringApplicationRunListener接口,后面是多一个s的。
1.1、SpringApplicationRunListener接口
可以来看下该接口的继承结构,只有一个实现类EventPublishingRunListener。
再来看该类的构造方法执行了什么操作。构造方法中实例化了一个SimpleApplicationEventMulticaster对象,该对象主要作用是发布事件。
addApplicationListener()方法调用的是父类AbstractApplicationEventMulticaster的方法。把Listener(即创建SpringApplication对象的时候设置的Listener)循环添加到了父类的ListenerRetriever对象的Set集合中,ListenerRetriever为内部类。
下面是类图,忽略了不相关