Spring Boot 启动流程详解
本文完整解析 Spring Boot 启动流程的 9 个核心阶段,结合源码与实战场景,帮助开发者深入理解框架运行机制。适用于面试准备和技术原理学习。
一、启动入口:SpringApplication.run()
public static ConfigurableApplicationContext run(Class<?> primarySource, String[] args) {return new SpringApplication(primarySource).run(args);
}
二、完整启动流程(9大核心阶段)
阶段1:初始化启动计时器
StopWatch stopWatch = new StopWatch();
stopWatch.start();
阶段2:监听器初始化与启动事件
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting(); // 发布ApplicationStartingEvent
- 作用:通知所有
SpringApplicationRunListener
启动开始 - 扩展点:可自定义监听器实现初始化日志、监控等操作
阶段3:环境准备与环境事件
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArgs);
graph TDA[创建Environment对象] --> B[加载配置源]B --> C[解析Profile配置]C --> D[转换配置属性]D --> E[发布ApplicationEnvironmentPreparedEvent]
阶段4:打印Banner
Banner printedBanner = printBanner(environment);
- 默认打印SPRING BOOT字符Logo
- 支持自定义banner.txt文件或完全禁用
阶段5:创建应用上下文
context = createApplicationContext();
上下文类型判断逻辑:
protected ConfigurableApplicationContext createApplicationContext() {return switch (this.webApplicationType) {case SERVLET -> new AnnotationConfigServletWebServerApplicationContext();case REACTIVE -> new AnnotationConfigReactiveWebServerApplicationContext();default -> new AnnotationConfigApplicationContext(); // 非Web应用};
}
阶段6:上下文预处理
prepareContext(context, environment, listeners, appArgs, printedBanner);
核心步骤:
- 关联环境配置到上下文
- 应用
ApplicationContextInitializer
扩展点 - 发布
ApplicationContextInitializedEvent
- 注册主配置类(
@SpringBootApplication
注解类) - 发布
ApplicationPreparedEvent
阶段7:★★★ 核心刷新阶段 ★★★
refreshContext(context); // 内部调用Spring的refresh()
Spring Framework的12步刷新流程:
public void refresh() {// 1. 准备刷新prepareRefresh();// 2. 获取BeanFactoryConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 3. 准备BeanFactoryprepareBeanFactory(beanFactory);try {// 4. 后置处理BeanFactorypostProcessBeanFactory(beanFactory);// 5. ★★★ 执行BeanFactoryPostProcessor(自动配置入口)invokeBeanFactoryPostProcessors(beanFactory);// 6. 注册BeanPostProcessorregisterBeanPostProcessors(beanFactory);// 7. 初始化消息源initMessageSource();// 8. 初始化事件广播器initApplicationEventMulticaster();// 9. ★ Web容器启动关键步骤onRefresh();// 10. 注册监听器registerListeners();// 11. ★★★ 实例化所有非延迟单例BeanfinishBeanFactoryInitialization(beanFactory);// 12. 完成刷新finishRefresh();} catch (BeansException ex) {// 异常处理...}
}
刷新阶段重点说明:
-
自动装配触发点(
invokeBeanFactoryPostProcessors
):protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());// 这里会处理@SpringBootApplication->加载自动配置类 }
-
嵌入式容器启动点(
onRefresh
):protected void onRefresh() {super.onRefresh();try {createWebServer(); // 启动Tomcat/Jetty} catch (Throwable ex) {throw new ApplicationContextException("Unable to start web server", ex);} }
-
Bean实例化点(
finishBeanFactoryInitialization
):protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// 初始化所有非延迟单例BeanbeanFactory.preInstantiateSingletons(); }
阶段8:刷新后处理
afterRefresh(context, appArgs);
- 默认空方法,开发人员可重写实现自定义逻辑
- 典型应用:初始化数据库数据、启动定时任务等
阶段9:事件通知与Runner执行
stopWatch.stop();
listeners.started(context); // ApplicationStartedEvent
callRunners(context, appArgs); // 执行ApplicationRunner/CommandLineRunner
listeners.running(context); // ApplicationReadyEvent
Runner执行机制:
private void callRunners(ApplicationContext context, ApplicationArguments args) {List<Object> runners = new ArrayList<>();runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());AnnotationAwareOrderComparator.sort(runners);for (Object runner : runners) {if (runner instanceof ApplicationRunner) {((ApplicationRunner) runner).run(args);}if (runner instanceof CommandLineRunner) {((CommandLineRunner) runner).run(args.getSourceArgs());}}
}
三、Spring Boot启动流程全景图
graph TDA[SpringApplication.run] --> B[启动计时器]B --> C[初始化监听器]C --> D[发布StartingEvent]D --> E[准备Environment]E --> F[打印Banner]F --> G[创建上下文]G --> H[预处理上下文]H --> I[refreshContext核心]I --> J[后置处理]J --> K[发布StartedEvent]K --> L[执行Runner]L --> M[发布ReadyEvent]
四、关键技术原理
1. 自动装配机制
- 通过
@EnableAutoConfiguration
引入自动配置 AutoConfigurationImportSelector
扫描META-INF/spring.factories
- 使用
@Conditional
系列注解实现条件装配
2. 嵌入式容器启动
- Servle容器:自动探测并初始化Tomcat/Jetty/Undertow
- Reactive容器:支持Netty/Reactor等
- 启动时机:在
onRefresh()
阶段创建WebServer
3. 配置加载顺序
1. 命令行参数
2. 系统环境变量
3. JNDI属性
4. Java系统属性
5. Profile-specific配置(application-{profile}.yml)
6. 主配置文件(application.yml)
7. @Configuration注解的@PropertySource
8. SpringApplication.setDefaultProperties