spring启动顺序里面用到了哪些细节​

5次阅读
没有评论

Spring 启动顺序涉及多个关键步骤和细节,我来详细解释一下:

Spring Boot 启动流程详解

1. SpringApplication.run() 执行阶段

  1. public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
  2. return run(new Class<?>[] { primarySource }, args);
  3. }

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: 获取 Environment
  • EnvironmentPostProcessor: 在 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. // 1. 最早执行:Environment 准备阶段
  2. @Order(1)
  3. class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
  4. @Override
  5. public void postProcessEnvironment(ConfigurableEnvironment environment,
  6. SpringApplication application) {
  7. // 环境变量设置
  8. }
  9. }
  10. // 2. 上下文初始化
  11. @Order(2)
  12. class MyApplicationContextInitializer
  13. implements ApplicationContextInitializer<ConfigurableApplicationContext> {
  14. @Override
  15. public void initialize(ConfigurableApplicationContext applicationContext) {
  16. // 上下文初始化
  17. }
  18. }
  19. // 3. BeanFactory 后置处理
  20. @Order(3)
  21. class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  22. @Override
  23. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
  24. // 修改 BeanDefinition
  25. }
  26. }
  27. // 4. Bean 后置处理
  28. @Order(4)
  29. class MyBeanPostProcessor implements BeanPostProcessor {
  30. @Override
  31. public Object postProcessBeforeInitialization(Object bean, String beanName) {
  32. // Bean 初始化前处理
  33. return bean;
  34. }
  35. @Override
  36. public Object postProcessAfterInitialization(Object bean, String beanName) {
  37. // Bean 初始化后处理
  38. return bean;
  39. }
  40. }
  41. // 5. 启动完成后运行
  42. @Component
  43. @Order(5)
  44. class MyApplicationRunner implements ApplicationRunner {
  45. @Override
  46. public void run(ApplicationArguments args) throws Exception {
  47. // 应用启动后执行
  48. }
  49. }

条件注解处理

配置文件加载顺序

  1. 命令行参数
  2. jar 包外部 application-{profile}.properties
  3. jar 包内部 application-{profile}.properties
  4. jar 包外部 application.properties
  5. jar 包内部 application.properties

这种分层和有序的启动机制确保了 Spring Boot 应用能够正确地初始化所有组件和服务。

正文完
 0
bdspAdmin
版权声明:本站原创文章,由 bdspAdmin 于2026-04-30发表,共计2898字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)