还不懂 Spring Boot 启动流程的,看这一篇就够了!

这篇具有很好参考价值的文章主要介绍了还不懂 Spring Boot 启动流程的,看这一篇就够了!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通常,我们只需为一个类添加@SpringBootApplication注解,然后再添加一个main方法,其内固定的写法为SpringApplication.run(Application.class, args)。由此,便可启动Spring Boot服务。

具体而言,Spring Boot的启动流程包括以下几个步骤:

载入 Spring Boot 应用的启动类

根据启动类所在的包路径扫描相关的类文件

基于扫描到的类自动配置 Spring 应用

激活内嵌的 Web 服务器

启动 Spring 应用程序的运行
深入解析Spring Boot启动过程的源码实现:

@SpringBootConfiguration // 标记该类为 Spring Boot 应用程序的配置类
@EnableAutoConfiguration // 启用 Spring Boot 的自动配置机制
public class MyApp {
 public static void main(String[] args) {
     SpringApplication.run(MyApp.class, args); // 执行 Spring Boot 应用程序
 }
}

在启动 Spring Boot 应用程序时,需要在启动类上使用 @SpringBootApplication 注解,以通知 Spring Boot 这是应用程序的启动类。@SpringBootApplication 注解包含了三个子注解,分别为 @Configuration、@EnableAutoConfiguration 和 @ComponentScan,分别表示该类是配置类、启用自动配置和扫描组件。

在 main 方法中,我们可以使用以下代码来启动 Spring Boot 应用程序:

public class MyApp {

    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }

}

该方法接受两个参数,第一个参数是启动类的类对象 MyApp.class,第二个参数是主方法的参数 args,主方法的参数可以通过命令行参数传递给应用程序。

在 SpringApplication.run 方法中,会执行以下几个步骤:

实例化一个 SpringApplication 对象,它存储了 Spring Boot 应用程序的所有配置信息。
基于 SpringApplication 中的配置信息,初始化一个 ApplicationContext 对象,它是 Spring 应用程序的上下文。
在 ApplicationContext 中注册所有带有 @Configuration 注解的类。
根据 @EnableAutoConfiguration 注解,自动配置 Spring 应用程序。
扫描所有带有 @Component 注解的类,并将它们注册到 ApplicationContext 中。
启动嵌入式 Web 服务器。
运行 Spring 应用程序。
以下是 SpringApplication.run 方法的源代码注释:

  /**
    *   这是 Spring Boot 应用程序的入口点
    *   @param primarySource 应用程序的主要源(通常是一个@Configuration类)。
    *   @param args 命令行参数。
    *   @return ApplicationContext。 
    */
    public static ConfigurableApplicationContext run(Class\<?> primarySource, String... args) {
        return run(new Class[]{primarySource}, args);
    }

    /**
    *   这是 Spring Boot 应用程序的入口点。
    *   @param primarySources 应用程序的主要源(通常是一个@Configuration类)。
    *   @param args 命令行参数。
    *   @return ApplicationContext。
    */
    public static ConfigurableApplicationContext run(Class&lt;?&gt;[] primarySources, String[] args) {
        // 创建一个新的 SpringApplication 实例,主要用于设置 SpringApplication 的属性
        SpringApplication application = new SpringApplication(primarySources);
        // 应用程序启动时应用的环境。 这可以被用来定制化应用程序环境以及激活不同的配置文件属性。默认情况下, SpringApplication 将使用适当的 PropertySourceLoader 从 application.properties 中加载默认的属性。
        applyInitializers(application);
        // 设置命令行参数
        ConfigurableApplicationContext context = application.run(args);
        // 后置操作
        postProcessApplicationContext(context);
        return context;
    }
    public static ConfigurableApplicationContext launch(Class&lt;?&gt; primarySource, String... args) {

         return launch(new Class<?>[] { primarySource }, args);

    }
    public static ConfigurableApplicationContext launch(Class<?>[] primarySources, String[] args) {

         // 创建 Launcher 对象,包含了所有的应用程序配置信息
         Launcher launcher = new Launcher(primarySources);
         // 运行应用程序,并返回上下文对象
         return launcher.run(args);

    }
    public ConfigurableApplicationContext run(String... args) {

         // 创建并启动 ConfigurableApplicationContext 对象,返回该对象
         ConfigurableApplicationContext context = createApplicationContext();
         // 执行应用程序的监听器
         listeners.starting(this.applicationArguments);
         try {
             // 准备 ApplicationContext 环境
             prepareEnvironment(context, this.environment);
             // 配置 ApplicationContext
             configureIgnoreBeanInfo(context);
             // 执行所有的 ApplicationContextInitializer
             applyInitializers(context);
             // 执行所有的 LauncherRunListener 的 starting 方法
             listeners.contextPrepared(context);
             // 打印应用程序的 Banner
             Banner printedBanner = printBanner();
             // 创建 ApplicationContext
             context.refresh();
             // 将 ApplicationContext 注册到 JVM 关闭钩子中
             prepareContext(context, printedBanner);
             // 执行所有的 ApplicationContextInitializer 的 postProcessApplicationContext 方法
             postProcessApplicationContext(context);
             // 执行所有的 LauncherRunListener 的 contextLoaded 方法
             listeners.contextLoaded(context);
         }
         catch (Throwable ex) {
             handleRunFailure(context, ex, listeners);
             throw new IllegalStateException(ex);
         }

         try {
             // 执行所有的 LauncherRunListener 的 started 方法
             listeners.started(context);
             // 启动嵌入式的 Web 服务器
             callRunners(context, this.applicationArguments);
         }
         catch (Throwable ex) {
             handleRunFailure(context, ex, listeners);
             throw new IllegalStateException(ex);
         }

         try {
             // 执行所有的 LauncherRunListener 的 running 方法
             listeners.running(context);
         }
         catch (Throwable ex) {
             handleRunFailure(context, ex, listeners);
             throw new IllegalStateException(ex);
         }

         return context;

    }

在 SpringApplication.run 方法的执行过程中,会涉及到一系列关键步骤,其中包括 prepareEnvironment、applyInitializers、postProcessApplicationContext和callRunners 等方法的调用。这些方法都扮演着启动 Spring Boot 应用程序的重要角色,它们会对应用程序进行配置、初始化、启动等操作,确保整个应用程序的正常运行和稳定性。
好的,基本上三分钟已经讲完了,希望对各位有所帮助。如果还有任何疑问或需要补充的内容,欢迎在评论区或私信留言。今天的总结内容就到这里了,感谢大家的阅读。文章来源地址https://www.toymoban.com/news/detail-453504.html

到了这里,关于还不懂 Spring Boot 启动流程的,看这一篇就够了!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 精通线程池,看这一篇就够了

    当我们运用多线程技术处理任务时,需要不断通过new的方式创建线程,这样频繁创建和销毁线程,会造成cpu消耗过多。那么有没有什么办法 避免频繁创建线程 呢? 当然有,和我们以前学习过多连接池技术类似,线程池通过提前创建好线程保存在线程池中, 在任务要执行时取

    2023年04月17日
    浏览(95)
  • CSS基础——看这一篇就够了

    目录 一、CSS简介 1.CSS是什么? 2.CSS的作用 3.CSS的构成 二、CSS选择器 1.基础选择器 (1).标签选择器 (2)类选择器 (3)标签选择器 (4) 通配符选择器 2.复合选择器 (1)后代选择器(包含选择器) (2)子选择器 (3)并集选择器 (4)伪类选择器  三、基本属性 1.字体属性

    2024年02月09日
    浏览(70)
  • SourceTree使用看这一篇就够了

     你梦想有一天成为git大师,然而面对复杂的git命令,你感觉TMD这我能记得住吗?你曾经羡慕从命令行敲git命令,才会更加炫酷,然而时间一长,TMD命令我有忘了。那么今天我介绍的这款工具会让你从git命令中解救出来,这就是git可视化工具SourcTree。 事实上Git的功能十分强大

    2024年02月08日
    浏览(63)
  • Linux 命令大全(看这一篇就足够)

    目录 第一章:Linux目录结构 第一节:基本介绍 第二节:Linux具体目录结构 第二章:Linux常用命令 第一节:目录处理命令 2.1.1 命令格式 2.1.2 列出目录的内容:ls 命令 2.1.3 创建目录:mkdir 命令 2.1.4 切换工作目录:cd 命令 2.1.5 显示当前路径:pwd 命令  2.1.6 删除空目录:rmdir 命

    2024年02月03日
    浏览(46)
  • Docker Volume 看这一篇就够了

    默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着: 当该容器不再存在时,数据不会持续存在,并且如果另一个进程需要数据,则可能很难将数据从容器中取出。 容器的可写层与运行容器的主机紧密耦合。您无法轻松地将数据移动到其他地方。 写入容

    2024年02月02日
    浏览(96)
  • ElasticSearch常见用法,看这一篇就够了

    2024送书福利正式起航 关注「哪吒编程」,提升Java技能 文末送3本《一本书讲透Elasticsearch:原理、进阶与工程实践》 大家好,我是哪吒。 ElasticSearch是一款由Java开发的开源搜索引擎,它以其出色的实时搜索、稳定可靠、快速安装和方便使用的特性,在Java开发社区中赢得了广

    2024年03月19日
    浏览(70)
  • 还不会二分查找?看这一篇就够了

    二分查找分为整数二分和浮点数二分,一般所说的二分查找都是指整数二分。 满足单调性的数组一定可以使用二分查找,但可以使用二分查找的数组不一定需要满足单调性。 不妨假设我们找到了条件 C 1 C_1 C 1 ​ ,它和它的 对立条件 C 2 C_2 C 2 ​ 能够将数组 a a a 一分为二,

    2024年01月19日
    浏览(51)
  • CAS自旋锁,看这一篇就够了

    前序 时隔多年,杰伦终于出了新专辑,《最伟大的作品》让我们穿越到1920年,见到了马格利特的绿苹果、大利的超现实、常玉画的大腿、莫奈的睡莲、徐志摩的诗… 他说“最伟大的作品”并不是自己的歌,而是这个世界上最伟大的艺术作品们。 为什么要写CAS自旋锁呢?最近

    2023年04月08日
    浏览(44)
  • 超图(HyperGraph)学习,看这一篇就够了

    最近事多,好久没更新了,随便写写(Ctrl+V)点 一、超图定义 通常图论中的图,一条edge只能连接2个vertex,在超图中,不限量 如何理解呢,就用我正在做的KT问题来看:7道题目-7个顶点;4种概念-4条超边,其中第1,2,3题都是考察概念1的,则构建一个包含了这仨的超边,以此类

    2024年02月02日
    浏览(63)
  • 还不会拓扑排序?看这一篇就够了

    拓扑排序是一种有向无环图(DAG)的顶点排序方法,它将一个有向无环图中的所有顶点排成一个线性序列,使得图中 任意一条有向边上的起点排在终点的前面 。 这样说还不够具体,我们先来看一个例子。假设某大学的课程安排如下: 课程编号 课程名称 先修课程 1 1 1 高等数

    2023年04月08日
    浏览(109)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包