Spring Boot 启动顺序
Spring Boot 启动顺序主要涉及多个关键步骤,涵盖 SpringApplication 初始化、环境准备、应用上下文创建,以及 运行阶段。以下是详细的启动顺序解析:
1. 启动引导(Bootstrap)
入口:SpringApplication.run()
- 创建
SpringApplication对象- 确定当前应用类型(
WebApplicationType) - 加载
ApplicationContextInitializer - 加载
ApplicationListener - 解析
@SpringBootConfiguration
- 确定当前应用类型(
2. 环境准备(Prepare Environment)
- 加载
SpringApplicationRunListeners并广播starting事件 - 构建
Environment(环境变量 + 配置)- 读取
application.properties/application.yml - 解析
SpringApplicationRunListener(如ConfigFileApplicationListener) - 处理
ConfigurableEnvironment,合并系统环境变量和应用配置
- 读取
- 应用
ApplicationContextInitializer - 允许外部初始化 Spring 上下文,例如:
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("ApplicationContextInitializer 执行!"); } }
3. 应用上下文(Application Context)初始化
- 创建
ApplicationContext(不同类型应用选择不同上下文)- 普通应用:
AnnotationConfigApplicationContext - Web 应用:
AnnotationConfigServletWebServerApplicationContext - 响应式 Web 应用:
AnnotationConfigReactiveWebServerApplicationContext
- 普通应用:
- 注册
BeanFactoryPostProcessor- 例如
ConfigurationClassPostProcessor,负责解析@Configuration
- 例如
- 调用
BeanDefinitionRegistryPostProcessor- 例如
@ComponentScan、@Import解析
- 例如
- 加载
@Configuration和@Bean
4. Bean 加载(Bean Factory)
- 调用
@Autowired和@Value进行依赖注入 - 执行
@PostConstruct方法 - 调用
BeanPostProcessor进行 AOP / 代理增强- 例如
@Transactional代理
- 例如
- 调用
SmartInitializingSingleton
5. 启动 ApplicationRunner 和 CommandLineRunner
- 处理
CommandLineRunner和ApplicationRunner
@Component
public class MyRunner implements CommandLineRunner {
@Override
public void run(String... args) {
System.out.println("CommandLineRunner 执行");
}
}
@Component
public class MyAppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("ApplicationRunner 执行");
}
}
ApplicationRunner 适用于更复杂的参数解析,CommandLineRunner 适用于简单参数处理。
6. 启动完成(Application Started)
- 广播
ApplicationStartedEvent - 启动 Web 服务器(如
Tomcat、Jetty) - 监听
ApplicationReadyEvent,应用进入运行状态 - 运行
Spring Boot Actuator(如启用了management监控) - Spring Boot 启动完成!
Spring Boot 启动顺序总结
SpringApplication初始化- 加载
Environment(配置解析) - 创建
ApplicationContext并注册BeanFactoryPostProcessor - 注册
BeanPostProcessor进行 AOP 代理 - 调用
SmartInitializingSingleton - 调用
CommandLineRunner和ApplicationRunner - 广播
ApplicationReadyEvent - 应用启动完成,准备处理请求
如果你想调试启动过程,可以加 debug 选项:
java -jar myapp.jar --debug
