2025-11-12 04:20:01

本文完整解析 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 TD

A[创建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. 获取BeanFactory

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

// 3. 准备BeanFactory

prepareBeanFactory(beanFactory);

try {

// 4. 后置处理BeanFactory

postProcessBeanFactory(beanFactory);

// 5. ★★★ 执行BeanFactoryPostProcessor(自动配置入口)

invokeBeanFactoryPostProcessors(beanFactory);

// 6. 注册BeanPostProcessor

registerBeanPostProcessors(beanFactory);

// 7. 初始化消息源

initMessageSource();

// 8. 初始化事件广播器

initApplicationEventMulticaster();

// 9. ★ Web容器启动关键步骤

onRefresh();

// 10. 注册监听器

registerListeners();

// 11. ★★★ 实例化所有非延迟单例Bean

finishBeanFactoryInitialization(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) {

// 初始化所有非延迟单例Bean

beanFactory.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 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 TD

A[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

Copyright © 2088 次元时空特惠站 - 二次元游戏活动特区 All Rights Reserved.
友情链接