您好,欢迎来到花生壳b2b外贸网信息发布平台!
18951535724
  • 深度拆解Spring Boot启动机制:从main方法到run调用的全流程源码分析

       2026-11-01 网络整理佚名1180
    核心提示:Spring Boot 最大的卖点就是“开箱即用”,但很多人只停留在会写 @SpringBootApplication。如果你不知道从 main 方法调用到容器启动之间发生了什么

    Spring Boot 最大的卖点就是“开箱即用”,但很多人只停留在会写 @SpringBootApplication。如果你不知道从 main 方法调用到容器启动之间发生了什么,那很多启动失败的问题都只能靠猜。

    Spring Boot 启动是什么?

    Spring Boot 的启动入口是 SpringApplication.run()。它内部做了两件事:一是创建 SpringApplication 实例,二是调用 run() 方法启动应用。整个流程非常紧凑,但隐藏了大量自动装配和事件机制。

    核心源码

    SpringApplication.run() 的核心逻辑在 SpringApplication 类中。它会先推断应用类型,然后创建 ApplicationContext,最后刷新容器。

    public ConfigurableApplicationContext run(String... args) {
        long startTime = System.nanoTime();
        DefaultBootstrapContext bootstrapContext = createBootstrapContext();
        configureHeadlessProperty();
        SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.starting(bootstrapContext, this.mainApplicationClass);
        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
            ConfigurableApplicationContext context = createApplicationContext();
            prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
            refreshContext(context);
            afterRefresh(context, applicationArguments);
            listeners.started(context, null);
            return context;
        }
        catch (Throwable ex) {
            handleRunFailure(context, ex, listeners);
            throw new IllegalStateException(ex);
        }
    }

    从 main 到 run 的完整流程

    一个 Spring Boot 应用从 main 方法启动,到容器可用的完整流程是:

    执行 SpringApplication.run()推断 web 应用类型(Servlet/Reactive/None)加载 SpringApplicationRunListener准备 Environment 和命令行参数创建 ApplicationContext准备 Context:注册主类、加载 sources刷新 Context:触发 Spring 标准 refresh()执行 CommandLineRunner 和 ApplicationRunner发布 ApplicationStartedEvent关键对比

    对比项

    Spring Boot

    传统 Spring

    启动入口

    SpringApplication.run()

    手动加载 ApplicationContext

    自动装配

    自动读取 META-INF/spring.factories

    手动配置

    嵌入容器

    内置 Tomcat/Jetty

    外部部署 WAR

    启动事件

    完整的 Spring Boot 生命周期事件

    标准 Spring 事件

    我的观点

    Spring Boot 的启动流程设计得非常精巧。它把复杂的 Spring 启动过程封装成了几个标准步骤,并通过事件机制让扩展变得简单。我在排查启动慢的问题时,通常会用 Spring Boot 的启动计时器定位耗时点。

    适合谁?不适合谁?总结

    Spring Boot 的启动流程本质上仍然是 Spring 的 refresh(),但在外面加了一层自动装配、环境准备和事件发布。理解了这一层,你就能解释为什么 Spring Boot 可以“零配置”运行。

    声明:本文为个人源码学习笔记,非商业推广。

     
    举报收藏 0打赏 0评论 0
    更多>相关评论
    暂时没有评论,来说点什么吧
    更多>同类百科知识
    推荐图文
    推荐百科知识