SpringBoot启动我总结一下分为三个阶段 1.启动前 2.启动 3.启动后

  • 启动前

  1. 推断应用类型 ,判断是web应用还是非web应用,是servlet应用还是webflux应用。
  2. SpringFactoriesLoader加载META-INF/spring.factories的配置文件中ApplicationContextInitializerApplicationListener的实现类。
  • 启动

  1. 启动计时器并注册shutdownhook钩子,创建一个 BootstrapContext用于接收配置中心的远程配置,发布第一个事件:ApplicationStartingEvent
  2. 加载配置环境Environment
  • 这一步会加载所有的配置属性,如 application.properties/yaml、命令行参数、BootstrapContext的远程配置等。完成后会发布 ApplicationEnvironmentPreparedEvent 事件。
  1. 根据推断出的应用类型创建对应的ApplicationContext
  2. PrepareContext准备上下文
    1. Environment关联到ApplicationContext
    1. 遍历并调用所有 ApplicationContextInitializerinitialize 方法
    1. 将启动类作为主配置类注册( @SpringBootConfiguration)
    1. 发布 ApplicationContextInitializedEventApplicationPreparedEvent 事件
  1. RefreshContext刷新上下文(包含启动完整的Bean生命周期)
    1. 执行BeanFactoryPostProcessor,其中子类ConfigurationClassPostProcessor会去解析注册所有标记了@Configuration的配置类,其中的主配置类就是第一个要处理的配置类,因为主配置类上的@EnableAutoConfiguration注解核心是导入的AutoConfigurationImportSelector,这个类会去加载META-INF/spring.factoriesMETA-INF/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的配置类,并根据@ConditionalOnXXX注解判断是否加载,最终注册成BeanDefinition
    1. 注册BeanPostProcessor,创建内嵌的Web服务器,然后实例化所有的BeanDefinition(bean的生命周期)
    1. bean实例化
    1. 设置bean的对象属性
    1. 执行Aware接口(BeanNameAware, BeanFactoryAware)
    1. BeanPostProcessor前置处理
    1. InitializingBean的afterPropertiesSet方法
    1. 自定义的init方法
    1. BeanPostProcessor后置处理
    1. 注册bean的销毁回调钩子
      到此bean的初始化完成,可以使用了。
  • 启动后

  1. 调用 ApplicationRunnerCommandLineRunner的run方法,并最终发布 ApplicationReadyEvent

至此容器启动成功

posted on 2025-09-19 14:18  wzkris  阅读(22)  评论(0)    收藏  举报