Java面试--SpringBoot启动流程

news2025/2/6 17:56:51

一、SpringBoot是什么

SpringBoot 是依赖于 Spring 的,比起 Spring,除了拥有 Spring 的全部功能以外,SpringBoot 无需繁琐的 Xml 配置,这取决于它自身强大的自动装配功能;并且自身已嵌入Tomcat、Jetty 等 web 容器,集成了 SpringMvc,使得 SpringBoot 可以直接运行,不需要额外的容器,提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等,

其实 Spring 大家都知道,Boot 是启动的意思。所以,Spring Boot 其实就是一个启动 Spring 项目的一个工具而已,总而言之,SpringBoot 是一个服务于框架的框架;也可以说 SpringBoot 是一个工具,这个工具简化了 Spring 的配置;

二、Spring Boot的核心功能

  1. 可独立运行的 Spring 项目:Spring Boot 可以以 Jar 包的形式独立运行
  2. 内嵌的 Servlet 容器:Spring Boot 可以选择内嵌 Tomcat、Jetty 或者 Undertow,无须以 war 包形式部署项目
  3. 简化的 Maven 配置:Spring 提供推荐的基础 POM 文件来简化 Maven 配置
  4. 自动配置 Spring:Spring Boot会根据项目依赖来自动配置 Spring 框架,极大地减少项目要使用的配置
  5. 提供生产就绪型功能:提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查
  6. 无代码生成和 Xml 配置:Spring Boot 不生成代码。完全不需要任何 Xml 配置即可实现 Spring 的所有配置

三、SpringBoot启动流程

SpringBoot的启动经过了一些一系列的处理,我们先看看整体过程的流程图

在这里插入图片描述

3.1、运行 SpringApplication.run() 方法

可以肯定的是,所有的标准的 SpringBoot 的应用程序都是从 run 方法开始的

package com.spring;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
 
@SpringBootApplication
public class App  {
    public static void main(String[] args) {
        // 启动springboot
        ConfigurableApplicationContext run = SpringApplication.run(App.class, args);
    }
}

进入 run 方法后,会 new 一个 SpringApplication 对象,创建这个对象的构造函数做了一些准备工作,编号第 2~5 步就是构造函数里面所做的事情

/**
 * Static helper that can be used to run a {@link SpringApplication} from the
 * specified sources using default settings and user supplied arguments.
 * @param primarySources the primary sources to load
 * @param args the application arguments (usually passed from a Java main method)
 * @return the running {@link ApplicationContext}
 */
public static ConfigurableApplicationContext run(Class<?>[] primarySources,
		String[] args) {
	return new SpringApplication(primarySources).run(args);
}

3.2、确定应用程序类型

在 SpringApplication 的构造方法内,首先会通过 WebApplicationType.deduceFromClasspath(); 方法判断当前应用程序的容器,默认使用的是Servlet 容器,除了 Servlet 之外,还有 NONE 和 REACTIVE (响应式编程);
在这里插入图片描述
具体代码

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
   // resourceLoader 赋值为 Null
   this.resourceLoader = resourceLoader;
   // primarySources不为空,继续向下执行。为空抛异常
   Assert.notNull(primarySources, "PrimarySources must not be null");
   // 将 SpringbootdemoApplication(启动类)赋值给 primarySources 
   this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
   // 从 classpath 类路径推断 Web 应用类型,有三种 Web 应用类型,分别是
   // NONE: 该应用程序不应作为 Web 应用程序运行,也不应启动嵌入式 Web 服务器
   // SERVLET: 该应用程序应作为基于 servlet 的 Web 应用程序运行,并应启动嵌入式 servlet Web 服务器。
   // REACTIVE: 该应用程序应作为响应式 Web 应用程序运行,并应启动嵌入式响应式 Web 服务器
   this.webApplicationType = WebApplicationType.deduceFromClasspath();
   // 初始化 bootstrapRegistryInitializers,通过 getSpringFactoriesInstances()获取工厂实例,
   // 底层使用的是反射Class<?> instanceClass = ClassUtils.forName(name, classLoader)动态加载实例对象。
   this.bootstrapRegistryInitializers = new ArrayList<>(
         getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
   // 初始化 ApplicationContextInitializer 集合
   setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
   // 初始化 ApplicationListener
   setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
   // 获取 StackTraceElement 数组遍历,通过反射获取堆栈中有 main 方法的类
   this.mainApplicationClass = deduceMainApplicationClass();
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C. Another Array Problem(思维)

Problem - C - Codeforces 给你一个有n个整数的数组a。允许你对它进行以下操作&#xff0c;次数不限&#xff08;0次或更多&#xff09;。 选择2个指数i,j&#xff0c;其中1≤i<j≤n&#xff0c;用|ai-aj|替换所有i≤k≤j的ak。 打印最终数组中所有元素的最大和&#xff0c…

TensorFlow之回归模型-1

1 基本概念 回归模型 一个回归模型会生成一个数值类型的预测结果&#xff0c;而一个分类模型会生成一个分类类型的预测结果&#xff0c;例如&#xff0c;如下列举一些回归模型&#xff1a; 一个模型预测一个商品房的价格走向&#xff0c;例如&#xff0c;某个时间点的总体市场…

大一学生《Web编程基础》HTML实例网页代码 HTML+CSS+JS 黑色横排的个人主页作品

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【MySQL】-事务以及隔离性问题

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【MySQL】 分享&#xff1a;落霞与孤鹜齐飞&#xff0c;秋水共长天一色。——《滕王阁序》 主要内容&#xff1a;事务的概念&#xff0c;代码使用&#xff0c;事务的四大性质、隔…

Shell是运维人员必须掌握的技能

文章目录Shell是运维人员必须掌握的技能Shell、Python 和 Perl1) Perl 语言2) Python 语言3) ShellShell是运维人员必须掌握的技能 Linux 运维人员就是负责 Linux 服务器的运行和维护。随着互联网的爆发&#xff0c;Linux 运维在最近几年也迎来了春天&#xff0c;出现了大量的…

Stm32标准库函数4——BlueTooth采集串口AD数据发送给电脑或者单片机

#include "stm32f10x.h" //在该头文件中默认定义系统时钟为72M #include "delay.h" #include "sys.h" #include "usart.h" #include "adc.h" //将USB转串口模块的Txd引脚电平通过蓝牙模块传送到单片机Rxd&#xff1b;同时…

Linux编辑器-vim的使用

vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也可以运行于xwindow、 mac o…

Unity Addressables资源管理 分析器 AnalyzeRule

Addressables资源管理总目录 0.窗口位置 打开的窗口 1.Fixable Rules 可修复的规则 1.1 Check Duplicate Bundle Dependencies 检查重复的Bundle依赖项 此规则通过扫描所有使用BundledAssetGroupSchemas的组&#xff0c; 并投影asset组布局来检查可能冗余的asset。 …

微服务框架 SpringCloud微服务架构 微服务面试篇 54 微服务篇 54.6 Nacos与Eureka的区别有哪些?【服务发现】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务面试篇 文章目录微服务框架微服务面试篇54 微服务篇54.6 Nacos与Eureka的区别有哪些&#xff1f;【服务发现】54.6.1 Nacos 的服务拉取…

基于STM32单片机智能自动伸缩衣架雨滴重量光强温度检测伸缩速度可调-蓝牙版

实践制作DIY- GC0010-智能自动伸缩衣架 一、功能说明&#xff1a; 基于STM32单片机设计-智能自动伸缩衣架 功能介绍&#xff1a; 基于STM32F103C系列&#xff0c;LCD1602显示器&#xff0c;光敏电阻采集光强&#xff0c;雨滴传感器&#xff0c;ULN2003控制步进电机&#xff0…

【Redis实战专题】「技术提升系列」彻底分析探究Redission实现分布式锁的点点滴滴

Redission的简介 Redission 为 Redis 官网分布式解决方案 官网&#xff1a; Redisson: Redis Java client with features of In-Memory Data Grid 快速入门&#xff1a; https://github.com/redisson/redisson#quick-start github的Redission系列&#xff1a;https://github…

SpringCloud学习笔记——Eureka 和 Nacos注册

SpringCloud01 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

2022年人工智能行业研究报告

第一章 行业概况 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是计算机科学的一个分支&#xff0c;它企图了解智能的实质&…

电脑剪辑视频用什么工具?好用的视频剪辑工具推荐

电脑剪辑视频用什么工具&#xff1f;小编通过搜集&#xff0c;给大家带来了几款比较适合做视频剪辑的工具。 一、Windows自带视频编辑器 win10自带的免费视频编辑器吗&#xff1f;我相信很多人应该不知道吧&#xff01;其实电脑自带的视频编辑器&#xff0c;也是可以进行裁剪视…

计算机毕业设计 SSM与Vue的宿舍后勤管理系统(源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.2.1 系统开发流程3.2.2 系统操作流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于…

BCN基团endo-BCN-SS-NHS ester

【产品描述】 endo-BCN-SS-NHS ester中BCN基团可以发生相应的点击反应&#xff0c;二硫键在化学上是一条从结合硫醇而衍生的单共价键。它又称为二硫键或双硫桥&#xff0c;差不多只用于生物化学的范畴。 【中文名称】endo 丙烷环辛炔-双硫键-活性酯 【英文名称】 endo-BCN-SS-N…

【人脸识别】LBP人脸识别【含GUI Matlab源码 1282期】

⛄一、LBP简介 LBP&#xff08;Local Binary Pattern&#xff0c;局部二值模式&#xff09;是一种用来描述图像局部纹理特征的算子&#xff1b;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikinen, 和D. Harwood 在1994年提出&#xff0c;用于纹理特…

2022注定的不平凡我

这次的时光好像没有追溯了&#xff0c;追溯请看这一篇文章拜拜嘞——老东家 时间很短&#xff0c;变化很快&#xff0c;一时间还有些承受不了&#xff0c;入职的两个月零四天&#xff0c;很突然的我被炒鱿鱼了。 依稀记得那个周五&#xff0c;Hr找我谈话&#xff0c;说目前达…

在3568开发板上开发外设模块——竟如此简单!

针对这些模块&#xff0c;我们编写了9个实验做成了《itop-3568开发板驱动实验手册》&#xff0c;从实验原理、硬件连接、原理图分析、实验平台、实验步骤一步一步教大家如果配置使用这些模块。 后续《itop-3568开发板驱动实验手册》中的实验也会全部录制成视频教程&#xff01;…

【Redis技术探索】「底层架构原理」帮你从底层彻底吃透RDB技术原理(入门第一步)

每日一句 低头是一种能力&#xff0c;它不是自卑&#xff0c;也不是怯弱&#xff0c;它是清醒中的嬗变。有时&#xff0c;稍微低一下头&#xff0c;或者我们的人生路会更精彩。 前提概要 Redis是一个的键-值&#xff08;K-V&#xff09;对的内存数据库服务&#xff0c;通常包含…