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