这里简单总结下 SpringBoot 项目的启动流程。
main() 方法中的 SpringApplication.run() 为整个 springboot 程序的主入口,即图一所示。
进入图一中的 run() 方法后可以看到程序会执行两个方法 SpringApplication() 和 run() 方法。
我们首先看一下 SpringApplication() 方法的执行流程
在创建SpringApplication对象的时候,在它的构造方法内部主要做3个事情。
其次是 run() 方法,这里贴一下 run() 方法的源码,主要内容为 try 语句里面的内容。
public ConfigurableApplicationContext run(String... args) {
SpringApplication.Startup startup = SpringApplication.Startup.create();
if (this.registerShutdownHook) {
shutdownHook.enableShutdownHookAddition();
}
DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
ConfigurableApplicationContext context = null;
this.configureHeadlessProperty();
SpringApplicationRunListeners listeners = this.getRunListeners(args);
listeners.starting(bootstrapContext, this.mainApplicationClass);
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
// 准备 Environment 对象
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
// 打印 Banner ,即 springboot 的那个图标
Banner printedBanner = this.printBanner(environment);
// 实例化 IOC 容器
context = this.createApplicationContext();
context.setApplicationStartup(this.applicationStartup);
// 准备容器,为容器设置 environment, BeanFactoryPostProcessot, 并加载主类对应的BeanDefinition。
this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
// 刷新容器,创建 Bean 实例
this.refreshContext(context);
this.afterRefresh(context, applicationArguments);
// 调用监听器
startup.started();
if (this.logStartupInfo) {
(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), startup);
}
listeners.started(context, startup.timeTakenToStarted());
this.callRunners(context, applicationArguments);
} catch (Throwable var10) {
if (var10 instanceof SpringApplication.AbandonedRunException) {
throw var10;
}
this.handleRunFailure(context, var10, listeners);
throw new IllegalStateException(var10);
}
try {
if (context.isRunning()) {
listeners.ready(context, startup.ready());
}
return context;
} catch (Throwable var9) {
if (var9 instanceof SpringApplication.AbandonedRunException) {
throw var9;
} else {
this.handleRunFailure(context, var9, (SpringApplicationRunListeners)null);
throw new IllegalStateException(var9);
}
}
}
面试时,可以根据源码按照总分总的形式回答出下面的内容: