Spring boot启动流程

Spring boot启动流程

本文根据网络资源整合。仅用来协助理解spring boot流程。
代码基于 spring-boot:4.0.1

一、启动入口

SpringApplication.run(MyApp.class, args);

二、核心启动流程

  1. 创建 SpringApplication 实例
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {

    // 推断web应用类型:NONE/SERVLET/REACTIVE
    this.properties.setWebApplicationType(WebApplicationType.deduce());

    // 从spring.factories加载所有ApplicationContextInitializer
    setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
    
    // 从spring.factories加载所有ApplicationListener
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    
    // 推断主配置类(main方法所在类)
    this.mainApplicationClass = deduceMainApplicationClass();
}
  1. 运行 run 方法

SpringApplication.java run方法精简

public ConfigurableApplicationContext run(String... args) {

    // 2.1 创建并启动事件监听器
    SpringApplicationRunListeners listeners = getRunListeners(args);
    listeners.starting(bootstrapContext, this.mainApplicationClass);
    
    // 2.2 封装启动参数
    ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    
    // 2.3 准备环境:加载配置、激活profile
    ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
    
    // 2.4 打印banner
    Banner printedBanner = printBanner(environment);
    
    // 2.5 创建ApplicationContext(根据webApplicationType创建)
    context = createApplicationContext();
    
    // 2.6 准备上下文:设置环境、执行initializers、加载Bean定义
    prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
    
    // 2.7 刷新上下文(核心IOC容器启动)
    refreshContext(context);
    
    // 2.8 刷新后的扩展钩子
    afterRefresh(context, applicationArguments);
    
    // 2.9 执行Runner接口(CommandLineRunner/ApplicationRunner)
    callRunners(context, applicationArguments);
}

三、简化流程图

main()
└─ SpringApplication.run()
├─ ① 推断web类型
├─ ② 加载spring.factories (listeners/initializers)
├─ ③ 环境准备 (加载yml)
├─ ④ 创建ApplicationContext
├─ ⑤ prepareContext (执行Initializers)
├─ ⑥ refreshContext (IOC核心: Bean扫描、注册、自动配置)
├─ ⑦ afterRefresh (启动WebServer)
└─ ⑧ callRunners (执行Runner接口)

tag

  • spring boot
  • 启动
posted @ 2026-05-24 21:28  微明Studio  阅读(10)  评论(0)    收藏  举报