1.运行run方法
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
this.configureHeadlessProperty();
//获取SpringApplicationRunListeners;从类路径下META-INF/spring.factories
SpringApplicationRunListeners listeners = this.getRunListeners(args);
//回调所有获取SpringApplicationRunListeners .starting()方法,starting()方法内部遍历listener并调用starting()方法
listeners.starting();
try {
//封装命令行参数
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
//环境准备
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
//环境准备完成后回调SpringApplicationRunListeners.penvironmentPrepared()方法,表示环境准备完成
Banner printedBanner = this.printBanner(environment);
//创建ApplicationContext,决定创建web的ioc还是普通的ioc
//contextClass = Class.forName(this.webEnvironment ? "org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext" : "org.springframework.context.annotation.AnnotationConfigApplicationContext");
//createApplicationContext()内部代码
context = this.createApplicationContext();
new FailureAnalyzers(context);
//准备上下文环境,将environment保存到ioc中
//回调之前的ApplicationContextInitalize的Initialize()方法
//回调所有的SpringApplicationRunListener的contextLoaded()方法
this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
//刷新容器,ioc容器初始话
this.refreshContext(context);
//从ioc容器中获取所有的ApplicationRunner和CommandLineRunner进行回调
//ApplicationRunner先回调,CommandlineRunner进行回调
this.afterRefresh(context, applicationArguments);
//所有的SpringApplicationRunListener回调finished方法
listeners.finished(context, (Throwable)null);
stopWatch.stop();
if (this.logStartupInfo) {
(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
}
//整个springboot应用启动完成后,返回ioc容器
return context;
} catch (Throwable var9) {
this.handleRunFailure(context, listeners, (FailureAnalyzers)analyzers, var9);
throw new IllegalStateException(var9);
}
}