springboot启动流程(三分钟了解 SpringBoot 的启动全流程)

Spring Boot 是一个基于 Spring 框架的快速开发、方便部署的框架,它简化了 Spring 应用程序的构建和部署过程。

Spring Boot 启动流程

1. 加载配置文件:Spring Boot 应用程序的配置信息存储在 application.properties 或 application.yml 配置文件中。在启动过程中,Spring Boot 会通过 Loaders 加载配置文件,并将其应用到应用程序上下文中。

2. 创建应用程序上下文:Spring Boot 根据配置文件创建应用程序上下文。应用程序上下文是 Spring 的核心容器,用于管理和组织应用程序的各个组件。

3. 扫描组件:Spring Boot 会扫描应用程序上下文中的包,并根据配置进行组件的扫描和加载。扫描到的组件可以是控制器、服务、存储库等。

4. 注入依赖:Spring Boot 使用依赖注入来管理组件之间的依赖关系。通过依赖注入,Spring Boot 将需要的组件注入到其他组件中,形成组件之间的依赖关系。

5. 自动配置:Spring Boot 的核心特性是自动配置,它根据应用程序的依赖关系和配置文件,自动配置和装配应用程序所需要的各种组件和功能。自动配置大大简化了应用程序的配置过程。

6. 启动应用程序:通过调用 SpringApplication.run() 方法或创建一个 Spring Boot 应用程序的实例来启动应用程序。该方法将触发应用程序的启动,并将控制权交给 Spring 框架。

7. 处理 Web 请求:如果应用程序是一个 Web 应用程序,Spring Boot 会根据配置启动一个嵌入式的 Web 服务器,并处理传入的 Web 请求。Spring Boot 内置支持多种 Web 服务器,如 Tomcat、Jetty 和 Undertow。

8. 运行应用程序:Spring Boot 会运行应用程序的主线程,处理请求和响应,并将结果返回给客户端。同时,Spring Boot 还提供了很多功能,如安全性、日志记录、监视和管理等。

springboot启动流程(三分钟了解 SpringBoot 的启动全流程)

核心源码分析

SpringApplication 类的 run() 方法,它会调用 Spring Boot 的各个初始化器进行初始化和准备工作。

public ConfigurableApplicationContext run(String... args) {
                 // 启动计时器
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

                 // 定义应用程序上下文和异常报告器列表
        ConfigurableApplicationContext context = null;
        Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();

                 // 配置 Headless 属性
        configureHeadlessProperty();

                 // 获取 Spring Boot 启动监听器
        SpringApplicationRunListeners listeners = getRunListeners(args);
                 // 执行启动监听器的 starting 方法
        listeners.starting();

        try {
                 // 解析命令行参数
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
                 // 准备应用程序环境
            ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
                 // 配置忽略 BeanInfo
            configureIgnoreBeanInfo(environment);
                 // 打印 Banner
            Banner printedBanner = printBanner(environment);
                 // 创建应用程序上下文
            context = createApplicationContext();
                 // 获取异常报告器,关于异常报告,我下次专门讲一下SpringBoot 的异常收集器。
            exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
                 // 准备应用程序上下文
            prepareContext(context, environment, listeners, applicationArguments, printedBanner);
                 // 刷新应用程序上下文
            refreshContext(context);
                 // 刷新后操作
            afterRefresh(context, applicationArguments);
                 // 停止计时器
            stopWatch.stop();
                 // 记录启动日志
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
            }
                 // 执行启动监听器的 started 方法
            listeners.started(context);
                 // 执行 Runner
            callRunners(context, applicationArguments);
        } catch (Throwable ex) {
                 // 处理启动失败
            handleRunFailure(context, ex, exceptionReporters, listeners);
            throw new IllegalStateException(ex);
        }

        try {
                 // 执行启动监听器的 running 方法
            listeners.running(context);
        } catch (Throwable ex) {
                 // 处理启动失败
            handleRunFailure(context, ex, exceptionReporters, null);
            throw new IllegalStateException(ex);
        }

                 // 返回应用程序上下文
        return context;
    }

1. Spring Boot 通过 `SpringApplication` 类的 `run` 方法启动应用程序。

2. 在启动过程中,`SpringApplication` 负责创建应用程序的上下文。

3. `SpringApplication` 使用 `
SpringApplicationRunListeners` 来通知应用程序启动过程中的事件。

4. `
springApplicationRunListeners` 调用 `starting()` 方法,该方法用于通知应用程序的启动开始。

5. `SpringApplication` 根据不同的条件决定创建合适的 `ApplicationContext`。

6. 使用 `SpringApplication` 的默认参数创建并配置 `ApplicationContext`。

7. 通过 `SpringApplication` 的 `prepareContext()` 方法,准备要使用的应用程序上下文。

8. 使用 `SpringApplication` 的默认参数创建并配置 `BeanDefinitionLoader`。

9. `BeanDefinitionLoader` 加载 `ApplicationContext` 中的 bean 定义。

10. `SpringApplication` 初始化 `ApplicationContext`。

11. 通过读取 `SpringApplication` 的属性,初始化 `ApplicationContext` 的环境。

12. `SpringApplication` 加载项目的配置文件。

13. 解析 `application.properties` 文件中的配置项,将其转换为 Spring Boot 属性。

14. 在启动过程中,`SpringApplication` 使用 `
SpringApplicationRunListeners` 来通知应用程序运行过程中的事件。

15. `
springApplicationRunListeners` 调用 `environmentPrepared()` 方法,该方法用于通知应用程序的环境配置完成。

16. `SpringApplication` 在应用程序的上下文中注册 `
ApplicationContextInitializer`。

17. `SpringApplication` 加载应用程序中的 `
SpringApplicationRunListener`。

18. `SpringApplication` 使用 `
SpringApplicationRunListeners` 来通知应用程序准备阶段的事件。

19. `
springApplicationRunListeners` 调用 `contextPrepared()` 方法,该方法用于通知应用程序的上下文准备完成。

20. `SpringApplication` 加载应用程序的 `ApplicationRunner` 和 `CommandLineRunner`。

21. `SpringApplication` 创建并刷新 `ApplicationContext`。

22. `SpringApplication` 使用注册的 `
ApplicationContextInitializers` 初始化 `ApplicationContext`。

23. `SpringApplication` 刷新上下文并调用 `onRefresh()` 方法。

24. `SpringApplication` 解析并启动 `Spring Boot` 的 `EmbeddedWebServer`。

25. `EmbeddedWebServer` 启动应用程序的 Web 服务器。

26. `EmbeddedWebServer` 注册 `DispatcherServlet`。

27. `DispatcherServlet` 处理 Web 请求,并将其分发给合适的控制器。

28. `SpringApplication` 使用 `
SpringApplicationRunListeners`来通知应用程序启动完成的事件。

29. `
springApplicationRunListeners` 调用 `started()` 方法,该方法用于通知应用程序的启动完成。

30. 应用程序启动完成后,就可以接收和处理用户请求了。

以上是关于 Spring Boot 启动流程的主要步骤和源码说明。要深入了解 Spring Boot 的启动流程和源码实现,建议查阅官方文档和源码。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 8838832@qq.com 举报,一经查实,本站将立刻删除。文章链接:https://www.wllpr.com/124802.html

发表评论

登录后才能评论