Spring Boot 最大的卖点就是“开箱即用”,但很多人只停留在会写 @SpringBootApplication。如果你不知道从 main 方法调用到容器启动之间发生了什么,那很多启动失败的问题都只能靠猜。
Spring Boot 启动是什么?
Spring Boot 的启动入口是 SpringApplication.run()。它内部做了两件事:一是创建 SpringApplication 实例,二是调用 run() 方法启动应用。整个流程非常紧凑,但隐藏了大量自动装配和事件机制。
核心源码
SpringApplication.run() 的核心逻辑在 SpringApplication 类中。它会先推断应用类型,然后创建 ApplicationContext,最后刷新容器。
public ConfigurableApplicationContext run(String... args) {
long startTime = System.nanoTime();
DefaultBootstrapContext bootstrapContext = createBootstrapContext();
configureHeadlessProperty();
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting(bootstrapContext, this.mainApplicationClass);
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
ConfigurableApplicationContext context = createApplicationContext();
prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
refreshContext(context);
afterRefresh(context, applicationArguments);
listeners.started(context, null);
return context;
}
catch (Throwable ex) {
handleRunFailure(context, ex, listeners);
throw new IllegalStateException(ex);
}
}
从 main 到 run 的完整流程
一个 Spring Boot 应用从 main 方法启动,到容器可用的完整流程是:
执行 SpringApplication.run()推断 web 应用类型(Servlet/Reactive/None)加载 SpringApplicationRunListener准备 Environment 和命令行参数创建 ApplicationContext准备 Context:注册主类、加载 sources刷新 Context:触发 Spring 标准 refresh()执行 CommandLineRunner 和 ApplicationRunner发布 ApplicationStartedEvent关键对比
对比项
Spring Boot
传统 Spring
启动入口
SpringApplication.run()
手动加载 ApplicationContext
自动装配
自动读取 META-INF/spring.factories
手动配置
嵌入容器
内置 Tomcat/Jetty
外部部署 WAR
启动事件
完整的 Spring Boot 生命周期事件
标准 Spring 事件
我的观点
Spring Boot 的启动流程设计得非常精巧。它把复杂的 Spring 启动过程封装成了几个标准步骤,并通过事件机制让扩展变得简单。我在排查启动慢的问题时,通常会用 Spring Boot 的启动计时器定位耗时点。
适合谁?不适合谁?总结
Spring Boot 的启动流程本质上仍然是 Spring 的 refresh(),但在外面加了一层自动装配、环境准备和事件发布。理解了这一层,你就能解释为什么 Spring Boot 可以“零配置”运行。
声明:本文为个人源码学习笔记,非商业推广。










