Spring 启动顺序涉及多个关键步骤和细节,我来详细解释一下:
Spring Boot 启动流程详解
1. SpringApplication.run() 执行阶段
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {return run(new Class<?>[] { primarySource }, args);}
2. 启动过程的关键步骤
2.1 创建 SpringApplication 实例
- 推断应用类型 (WebFlux, WebMvc, 或普通应用)
- 加载 ApplicationContext 初始化器
- 加载 ApplicationListener 监听器
- 推断主配置类
2.2 运行时环境准备
- 调用
listeners.starting()– 发布 ApplicationStartingEvent - 准备 Environment 环境
- 创建并配置 ApplicationContext
- 调用
listeners.environmentPrepared()– 发布 ApplicationEnvironmentPreparedEvent
2.3 上下文创建和配置
- 创建 ApplicationContext 实例
- 设置 Environment
- 调用 ApplicationContext 初始化器
- 调用
listeners.contextPrepared()– 发布 ApplicationContextInitializedEvent - 加载所有主配置类
2.4 刷新上下文
- 调用
refresh()方法执行核心刷新逻辑 - BeanFactory 后置处理
- Bean 后置处理器注册
- 国际化消息加载
- 初始化事件广播器
- 注册监听器
- 初始化非延迟单例 Bean
2.5 启动完成
- 调用
listeners.started()– 发布 ApplicationStartedEvent - 调用 ApplicationRunner 和 CommandLineRunner
- 调用
listeners.running()– 发布 ApplicationReadyEvent
关键的生命周期接口
1. Environment 相关
EnvironmentAware: 获取 EnvironmentEnvironmentPostProcessor: 在 Environment 准备好后进行处理
2. Bean 生命周期接口
BeanFactoryPostProcessor: BeanFactory 后置处理器BeanPostProcessor: Bean 后置处理器InitializingBean: 初始化回调DisposableBean: 销毁回调
3. 应用生命周期接口
ApplicationRunner: 应用启动后运行CommandLineRunner: 命令行运行器SmartLifecycle: 智能生命周期管理
启动过程中的关键组件
1. ApplicationEventMulticaster
负责发布和监听各种启动事件:
- ApplicationStartingEvent
- ApplicationEnvironmentPreparedEvent
- ApplicationContextInitializedEvent
- ApplicationPreparedEvent
- ApplicationStartedEvent
- ApplicationReadyEvent
- ContextRefreshedEvent
2. ApplicationContextInitializer
在上下文刷新前进行自定义配置。
3. SpringFactoriesLoader
用于加载 classpath 下的 META-INF/spring.factories 文件中定义的扩展点。
启动顺序细节示例
// 1. 最早执行:Environment 准备阶段@Order(1)class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment,SpringApplication application) {// 环境变量设置}}// 2. 上下文初始化@Order(2)class MyApplicationContextInitializerimplements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {// 上下文初始化}}// 3. BeanFactory 后置处理@Order(3)class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 修改 BeanDefinition}}// 4. Bean 后置处理@Order(4)class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {// Bean 初始化前处理return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {// Bean 初始化后处理return bean;}}// 5. 启动完成后运行@Component@Order(5)class MyApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {// 应用启动后执行}}
条件注解处理
@ConditionalOnProperty: 基于属性条件@ConditionalOnClass: 基于类存在条件@ConditionalOnMissingBean: 基于缺少 Bean 条件- 自动配置按需加载
配置文件加载顺序
- 命令行参数
- jar 包外部 application-{profile}.properties
- jar 包内部 application-{profile}.properties
- jar 包外部 application.properties
- jar 包内部 application.properties
这种分层和有序的启动机制确保了 Spring Boot 应用能够正确地初始化所有组件和服务。
正文完