Spring Boot的工作原理
文章目录
- 前言
- 一、Spring Boot的核心原理
- 二、Spring Boot的工作原理
- 1.创建SpringApplication对象
- 2.调用实例的run方法
- 总结
前言
在上一篇《初识SpringBoot并构建第一个SpringBoot项目》的学习后,我们对Spring Boot有了基本了解。现在,我们将通过学习Spring Boot的工作原理来进一步深入。
一、Spring Boot的核心原理
Spring Boot 的核心原理是基于 Spring 框架的,它通过自动配置(AutoConfiguration)和约定优于配置(Convention Over Configuration)的方式快速构建和部署 Spring 应用。
-
自动配置:Spring Boot 根据应用类路径下的依赖关系,自动装配(AutoConfiguration)相应的组件和配置。它通过在类路径中扫描配置文件和注解,将各个组件进行自动装配,减少了手动配置的工作量。
-
约定优于配置:Spring Boot 提供了一套默认的配置规则和约定,大部分情况下可以通过按照约定进行配置,而不需要显式地指定各种细节。它采用了一种约定的方式,将应用的配置和代码分离,使得配置更加简洁和易于维护。
二、Spring Boot的工作原理
首先,我们先看下Spring Boot的主类代码。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MyProjectApplication {public static void main(String[] args) {SpringApplication.run(MyProjectApplication.class, args);}
}
从这个代码里,我们可以看到,在main()方法里,仅调用了SpringApplication.run()方法。总体上来说,可以分为两部分:一是创建SpringApplication对象,二是调用实例的run方法。
1.创建SpringApplication对象
创建SpringApplication对象时,主要干了下面4个事情。
-
推断应用的类型是普通的项目还是Web项目。主要是通过classpath内是否存在某个特征类来进行判断。判断后用webEnvironment进行标记。
-
查找并加载所有可用初始化器 , 设置到initializers属性中。主要使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。
-
找出所有的应用程序监听器,设置到listeners属性中。主要使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。
-
推断并设置main方法的定义类,找到运行的主类。
SpringApplication的构造器:
public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {// ......this.webApplicationType = WebApplicationType.deduceFromClasspath();this.setInitializers(this.getSpringFactoriesInstances();this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass = this.deduceMainApplicationClass();
}
2.调用实例的run方法
简单的说,调用run()方法就是根据配置内容,确定哪些配置生效的过程。
主干调用主要有以下几步:
-
收集各种条件和回调接口,包括SpringApplicationRunListener等。调用它们的started()方法。
-
创建并配置当前Spring Boot应用将要使用的Environment。并调用environmentPrepared(),表明环境已经准备完毕。
-
创建并初始化ApplicationContext。包括设置环境,加载配置等。并调用SpringApplicationRunListener的contextPrepared()方法和contextLoaded()方法。
注意:这一步会将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。 -
调用ApplicationContext的refresh()方法,完成程序启动。
-
遍历执行SpringApplicationRunListener的finished()方法。
此外,在初始化过程中,还有很多额外的扩展点,比如在第二步完成后,如果SpringApplication的showBanner属性被设置为true,则打印banner。
以下示例演示了 SpringApplication 如何在启动时调用 run() 方法:
public class SpringApplication {public static void run(Class<?> primarySource, String[] args) {SpringApplication application = new SpringApplication(primarySource);SpringApplicationBuilder builder = application.createSpringApplicationBuilder();// 设置应用程序环境ConfigurableApplicationContext context = builder.run(args);// 应用程序已启动,可以执行自定义逻辑context.close();}// 其他方法
}
在这个示例中,run() 方法首先创建一个 SpringApplication 实例。然后,它使用 SpringApplicationBuilder 设置应用程序环境并创建应用程序上下文。最后,它调用应用程序上下文的 run() 方法来启动应用程序。
总结
以上就是对Spring Boot的核心原理和工作原理的介绍,通过上面的学习,可以更好地理解Spring Boot框架是如何设计和运作的,并更加高效地开发应用程序。
参考文档:
1、SpringBoot运行原理分析
2、Spring Boot 运作原理
3、Spring Boot工作原理
如果这篇博客对大家有所帮助,我希望能得到各位的免费
点赞
和收藏
,作为对我的鼓励和支持。
同时,也请大家在评论区
留下您宝贵的意见和建议,我将非常欢迎。
感谢大家的支持
、评论
和收藏
!!!
相关文章:
Spring Boot的工作原理
文章目录 前言一、Spring Boot的核心原理二、Spring Boot的工作原理1.创建SpringApplication对象2.调用实例的run方法 总结 前言 在上一篇《初识SpringBoot并构建第一个SpringBoot项目》的学习后,我们对Spring Boot有了基本了解。现在,我们将通过学习Sp…...
单点登录和统一身份认证的区别
在工作过程中,总被问到单点登录和统一身份认证的问题。笔者打算尝试用更通俗的方式解释统一身份认证(Unified Identity Authentication)和单点登录(Single Sign-On,简称SSO)之间的区别。 1.定义࿱…...

革新机器人任务规划:TREE-PLANNER引领高效、准确的机器人动作生成新趋势
DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! 引言 任务规划在机器人技术中扮演着至关重要的角色。它涉及到为机器人设计一系列中级动作(技能),使其能够完成复杂的高级任…...

【数据分析面试】42.用户流失预测模型搭建(资料数据分享)
题目 保持高的客户留存率可以稳定和提到企业的收入。因此,预测和防止客户流失是在业务中常见的一项数据分析任务。这次分享的数据集包括了电信行业、银行、人力资源和电商行业,涵盖了不同业务背景下的流失预测数据。 后台回复暗号(在本文末…...

5.13号模拟前端面试10问
1.介绍箭头函数和普通函数的区别 箭头函数和普通函数在JavaScript中有一些重要的区别。以下是关于这些区别的详细解释: 语法结构上的差异: 箭头函数使用更简洁的语法,它不需要使用function关键字,而是使用一个箭头(…...
学习使用jQuery将光标移动到textarea的末尾
学习使用jQuery将光标移动到textarea的末尾 代码 代码 $(document).ready(function(){var textarea $(#your-qipa-id); // 替换为你的textarea IDtextarea.focus(); // 将焦点设置到textarea// 获取textarea的值的长度var len textarea.val().length;// 使用setSelectionRan…...

【送书福利第七期】你好!Java(文末送书)
文章目录 编辑推荐内容简介作者简介目录前言/序言 编辑推荐 适读人群 :程序员;相关院校师生 本书以轻松幽默的语言,从零开始介绍Java语言。书名来源于编程语言中最经典的Hello World程序,寓意带读者从入门到精通。 书中每章都设有总结与扩展…...

申贷时,银行级大数据自己能查到吗?
随着金融风控的不断健全,大数据作为辅助的风控工具正在被越来越多的银行和机构使用。在进行申贷时,银行通常会进行大数据查询,以便评估申请人的信用状况。那么,这些大数据自己能查到吗?接下来本文就为大家详细介绍一下࿰…...

【SVN-TortoiseSVN】SVN 的简介与TortoiseSVN 安装使用教程
目录 🌞前言 🌊1. SVN 的简介 🌍1.1 SVN是什么 🌍1.2 SVN 工作原理 🌍1.3 TortoiseSVN 术语及定义 🌊2. TortoiseSVN 安装与汉化 🌊3. SVN 基本操作-TortoiseSVN 🌍3.1 浏览…...
5.13学习日志
Pytorch 神经网络基础 1.模型构造 1》层和块 块可以描述单个层,由多个层组成的组件或者模型本身 块由类表示,类的任何子类都必须定义一个将其输入转换为输出的前向传播函数。为了计算梯度,块必须具有反向传播函数 自定义块: …...

8种常见的CMD命令
1.怎么打开CMD窗口 步骤1:winr 步骤2:在弹出的窗口输入cmd,然后点击确认,就会出现一个cmd的窗口 2.CMD的8种常见命令 2.1盘符名称冒号 说明:切换盘的路径 打开CMD窗口这里默认的是C盘的Users的27823路径底下…...

版本控制工具之Git的基础使用教程
Git Git是一个分布式版本控制系统,由Linux之父Linus Torvalds 开发。它既可以用来管理和追踪计算机文件的变化,也是开发者协作编写代码的工具。 本文将介绍 Git 的基础原理、用法、操作等内容。 一、基础概念 1.1 版本控制系统 版本控制系统&#x…...

五子棋对战(网页版)
目录 一、项目背景 用户模块 匹配模块 对战模块 二、核心技术 三、相关知识 WebSocket 原理 报文格式 代码 服务器代码 客户端代码 四、项目创建 4.1、实现用户模块 编写数据库代码 数据库设计 配置MyBatis 创建实体类 创建UserMapper 创建UserMapper接口 实现UserMapper.xml 前…...

在 Ubuntu系统中,可以使用以下几种方法查看网络速率
1 使用终端命令:可以使用ifconfig命令查看网络接口的信息,包括网络接口名称、IP地址、子网掩码等。也可以使用nload命令查看网络流量和传输速率。 2 使用网络监控工具:例如nethogs,可以更加直观地查看网络吞吐量。 3 使用网络测…...
这是摆脱困境的最好方法
20多年前,我开始涉足创业,经历过的那种停滞感我都记不清了。这是这条职业道路上最常见的挣扎之一,而且很难摆脱。 卡住的城市是一个地方,任何有创造力的,自由职业者和好奇的人经常去。这是一个很难逃离的地方。 被困…...
OceanBase 中的ROWID与Oracle的差异与如何迁移
1. ROWID 1.1 OB和Oracle中rowid的区别 正如大家所知道的,OceanBase兼容Oracle的rowid特性,但在其生成规则上却存在不同,具体表现如下: OceanBase ● 定义:OceanBase(简称 OB)的rowid是通过…...

秋招后端开发面试题 - JVM运行时数据区
目录 运行时数据区前言面试题JVM 内存区域 / 运行时数据区?说一下 JDK1.6、1.7、1.8 内存区域的变化?为什么使用元空间替代永久代作为方法区的实现?Java 堆的内存分区了解吗?运行时常量池?字符串常量池了解吗ÿ…...

【YOLOv8改进[Backbone]】使用SCINet改进YOLOv8在黑暗环境的目标检测效果
目录 一 SCINet 1 本文方法 ① 权重共享的照明学习 ② 自校准模块 ③ 无监督训练损失 二 使用SCINet助力YOLOv8在黑暗环境的目标检测效果 1 整体修改 2 配置文件 3 训练 其他 一 SCINet 官方论文地址:https://arxiv.org/pdf/2204.10137 官方代码地址&…...
ASE docker related research
ASE 2022 Understanding and Predicting Docker Build Duration: An Empirical Study of Containerized Workflow of OSS Projects 理解和预测 Docker 构建持续时间:OSS 项目容器化工作流程的实证研究 Docker 构建是容器化工作流程的关键组成部分,它…...

maven .lastUpdated文件作用
现象 有时候我在用maven管理项目时会发现有些依赖报错,这时你可以看一下本地仓库中是否有.lastUpdated文件,也许与它有关。 原因 有这个文件就表示依赖下载过程中发生了错误导致依赖没成功下载,可能是网络原因,也有可能是远程…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...