SpringBoot 启动流程

一、SpringBoot 启动流程主要可以概括为以下几个步骤:

  1. 加载启动类
    当 SpringBoot 项目启动时,会在当前工作目录下寻找有@SpringBootApplication注解标识的类,并把这个类作为应用程序的入口点。如果找不到这样的主类,则会打印错误信息并退出。
  2. 加载配置文件
    SpringBoot会自动扫描当前项目的resources目录,并加载其中的application.properties或application.yml等配置文件。这些配置文件中包含了应用程序的各种参数,例如数据库连接信息、日志级别等等。
  3. 初始化ApplicationContext
    SpringBoot会创建一个SpringApplication对象,并调用其run()方法来初始化ApplicationContext。这个过程中,SpringBoot会读取配置文件中的参数,并将它们转换成Environment对象中的属性。同时,它还会扫描当前项目中的所有Bean,并将它们注册到ApplicationContext中。
  4. 启动内嵌的Web服务器
    SpringBoot内置Tomcat和Jetty等Web服务器,当SpringBoot应用程序启动时,它会根据配置文件中的信息自动创建Tomcat或Jetty等Web容器,并将Spring容器注册到Web容器中,使得SpringBoot应用程序可以直接以Web应用程序的形式运行。
  5. 启动应用程序
    根据之前创建好的 Spring 容器以及Web服务器,启动相应的线程进行服务处理。
  6. 监听应用程序的状态
    SpringBoot会监听应用程序的状态,并根据需要进行相应的操作。例如,当应用程序退出时,它会打印出详细的日志信息,并将应用程序的上下文环境恢复到初始状态。

二、SpringBoot 启动源码分析

(1)首先是启动类源码
在这里插入图片描述
启动类必须使用 @SpringBootApplication 注解标记该类。在启动类的main()方法中,调用了SpringApplication.run() 方法来启动 Spring Boot 应用程序。该方法接受两个参数,第一个参数是启动类的类对象,第二个参数是主方法的参数。

(2)SpringApplication.run()方法源码
在这里插入图片描述
在这里插入图片描述
最终通过创建一个SpringApplication对象,并调用其run()方法来执行项目启动的后续操作。

	public ConfigurableApplicationContext run(String... args) {// 创建一个SpringApplication对象的启动器(Startup),并返回一个Startup对象。// 启动器是一个非常重要的概念,它可以帮助我们快速地启动应用程序,并进行一些基本的配置和初始化操作。Startup startup = SpringApplication.Startup.create();// 判断当前应用程序是否需要注册一个系统级别的关闭钩子,如果需要,则调用enableShutdownHookAddition方法来注册该钩子。// 关闭钩子是一个非常重要的概念,它可以帮助我们在应用程序退出时执行一些清理操作,例如关闭数据库连接池、释放网络资源等等。if (this.registerShutdownHook) {shutdownHook.enableShutdownHookAddition();}// 创建一个应用程序上下文,并将其传递给DefaultBootstrapContext对象,以便在应用程序启动时进行一些初始化工作。DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();ConfigurableApplicationContext context = null;// 配置系统属性的方法,用于指示当前应用程序是否没有图形界面。为"true"时,表示当前应用程序没有图形界面,因此无法进行一些与图形界面相关的操作。this.configureHeadlessProperty();// 获取RunListeners对象,它包含了应用程序在启动和运行过程中的监听器,以便应用程序能够正确地监听和处理各种事件和通知。SpringApplicationRunListeners listeners = this.getRunListeners(args);// 用于启动应用程序的监听器的方法,触发应用程序启动时的一些监听器,并让它们在应用程序启动时执行一些操作。listeners.starting(bootstrapContext, this.mainApplicationClass);try {// 创建一个DefaultApplicationArguments对象,并将传入的命令行参数赋值给它。// 这个对象可以用于后续的代码中,以便在应用程序启动时获取命令行参数。ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);// 创建一个ConfigurableEnvironment对象,并将它赋值给环境变量。这个对象可以用于后续的代码中,以便在应用程序启动时获取环境属性。ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);// 生成一个Banner对象,并将它打印到控制台中,以便用户能够了解应用程序的版本号、作者信息等。Banner printedBanner = this.printBanner(environment);// 创建一个ApplicationContext对象,并将它赋值给ApplicationContext变量,以便在应用程序启动时获取ApplicationContext属性和方法。context = this.createApplicationContext();// 将传入的ApplicationStartup对象赋值给ApplicationContext的ApplicationStartup属性。context.setApplicationStartup(this.applicationStartup);// 根据传入的参数,创建一个ApplicationContext对象,并对其进行一些初始化操作,以便在应用程序启动时能够正常运行。this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);// 刷新ApplicationContext对象,启动tomcat服务器this.refreshContext(context);// 在ApplicationContext刷新完成后执行一些操作。this.afterRefresh(context, applicationArguments);// 启动应用程序。startup.started();// 是否记录应用程序启动信息if (this.logStartupInfo) {(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), startup);}// 通知所有启动监听器应用程序已经启动listeners.started(context, startup.timeTakenToStarted());// 遍历所有的运行器,并调用它们的run方法,将应用程序运行起来this.callRunners(context, applicationArguments);} catch (Throwable var10) {if (var10 instanceof AbandonedRunException) {throw var10;}// 遍历所有的监听器,并通知它们应用程序启动失败的情况this.handleRunFailure(context, var10, listeners);// 抛出一个IllegalStateException异常,表示应用程序无法继续启动throw new IllegalStateException(var10);}try {// 判断ApplicationContext是否已经开始运行if (context.isRunning()) {// 如果是,则调用ready方法通知所有就绪监听器应用程序已经就绪listeners.ready(context, startup.ready());}// 返回ConfigurableApplicationContext对象return context;} catch (Throwable var9) {if (var9 instanceof AbandonedRunException) {throw var9;} else {this.handleRunFailure(context, var9, (SpringApplicationRunListeners)null);throw new IllegalStateException(var9);}}}

总的来说,Spring Boot的启动过程是一个复杂的流程,从启动类的Main方法中调用SpringApplication.run(DemoApplication.class, args)方法开始,然后在SpringApplication对象的run方法中做了一系列操作来完成项目启动所需的初始化Spring容器、启动内置tomcat、启动应用程序以及通知监听者等步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/336930.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麒麟系统安装docker、mysql、clickhouse

1、查看麒麟系统版本信息 cat /etc/os-release 麒麟系统版本V10 64位操作系统 # uname -p x86_64 # uname -p aarch64 内核版本 # uname -r 4.19.90-24.4.v2101.ky10.x86_64 本操作为麒麟系统版本V10,x86_64操作系统 一,安装docker 文件&#xff1a…

CANoe中的signalGenerators

前言: SignalGenerators可以理解为一个简单的信号发生器,用户能够指定特定的信(LDF,DBC,XML中定义的信号,用户自定义的系统变量,环境变量,和系统自带的环境变量)按照指定的波形,输出…

不用下载的在线photoshop,谁能不爱!

多年来,Photoshop 一直是设计师的首选。Photoshop 的功能无疑是非常强大的。设计师可以使用它来制作从简单的网页到复杂的移动应用程序设计。学习 Photoshop 的基本知识很容易,但学习 Photoshop 的所有技能都需要大量的时间和精力。许多新的 UI 设计合作…

npm install node-sass安装失败的解决方案

解决方案 1. 检查node-sass安装版本是否正确。 本地安装的node版本不同,需要安装的node-sass版本也是不一样的。node-sass官方给出了不同版本的node和node-sass的对应关系,读者可访问node-sass github仓库或者node-sass npm仓库进行查看。 本地安装的n…

静态界面——倒计时

静态界面——倒计时 功能代码界面展示 功能代码 <!DOCTYPE html> <html><head><title>倒计时</title><style>body {font-family: Arial, sans-serif;text-align: center;}h1 {font-size: 80px;color: #ff0000;line-height: 40vh;}.topSty…

iOS快捷指令蓝牙开关

前提条件&#xff1a;手机系统蓝牙与目标设备蓝牙已配对 设置蓝牙执行总次数&#xff0c;修改执行的app&#xff0c;蓝牙当前每次断开重连是6s&#xff0c;执行5次发送通知&#xff0c;修改微信接受人。 主要适用于依赖蓝牙秒连的APP&#xff0c;压力测试。 下载地址

C语言如何提高程序的可读性?

一、问题 可读性是评价程序质量的一个重要标准&#xff0c;直接影响到程序的修改和后期维护&#xff0c;那么如何提高程序的可读性呢? 二、解答 提高程序可读性可以从以下几方面来进行。 &#xff08;1&#xff09;C程序整体由函数构成的。 程序中&#xff0c;main()就是其中…

如何使用web文件管理器Net2FTP搭建个人网盘

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

Mac创建本地数据库并连接

文章目录 一、下载安装MySql数据库二、查看本地MySQL三、Navcat连接数据库四、样例表脚本 一、下载安装MySql数据库 在MySql官网下载MySQL Community Server 可以选择默认配置安装数据库 二、查看本地MySQL 可以在本地“系统偏好设置”最下方&#xff0c;查看自己的MySql服…

系统性介绍MoE模型架构,以及在如今大模型方向的发展现状

知乎&#xff1a;Verlocksss编辑&#xff1a;马景锐链接&#xff1a;https://zhuanlan.zhihu.com/p/675216281 1 学习动机 第一次了解到MoE&#xff08;Mixture of experts&#xff09;&#xff0c;是在GPT-4模型架构泄漏事件&#xff0c;听说GPT-4的架构是8个GPT-3级别大小的模…

【案例】尺寸公差软件 -手机装配公差案例-DTAS3D-国产智能

背景&#xff1a; 随着智能手机行业的快速发展&#xff0c;手机装配的精度要求越来越高。尺寸公差软件在手机装配过程中扮演着至关重要的角色&#xff0c;可以帮助制造商提高产品质量和生产效率。本案例介绍了国产智能手机装配过程中使用的尺寸公差软件 DTAS3D&#xff0c;以及…

MySQL数据库导入导出远程备份

一 navcat导入导出 导入 选择数据库 选择自己需要的的脚本进行导入 18万的sql脚本数据 导入时间33秒左右 导出 选择表右击----转存SQL文件---结构和数据 导出时间比较快 二 mysqldump 导入导出 先进入mysql的安装bin目录下&#xff0c;先将所要导入的脚本放入该bin目录下…