SpringBoot篇(简化操作的原理)

目录

一、代码位置

二、统一版本管理(parent)

三、提供 starter简化 Maven 配置

四、自动配置 Spring(引导类)

五、嵌入式 servlet 容器


一、代码位置

二、统一版本管理(parent)

SpringBoot项目都会继承一个父依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/> <!-- lookup parent from repository --></parent>

parent 自身具有很多个版本,每个 parent 版本中包含有几百个其他技术的版本号,不同的parent间使用的各种

技术的版本号有可能会发生变化。当开发者使用某些技术时,直接使用SpringBoot提供的 parent 就行了,由

parent 帮助开发者统一的进行各种技术的版本管理整体上来说,使用parent可以帮助开发者进行版本的统一管

项目中的pom.xml中继承了一个坐标

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version>
</parent>

打开后可以查阅到其中又继承了一个坐标

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.5.4</version>
</parent>

这个坐标中定义了两组信息第一组是各式各样的依赖版本号属性,下面列出依赖版本属性的局部,可以看的出

来,定义了若干个技术的依赖版本号。

<properties><activemq.version>5.16.3</activemq.version><aspectj.version>1.9.7</aspectj.version><assertj.version>3.19.0</assertj.version><commons-codec.version>1.15</commons-codec.version><commons-dbcp2.version>2.8.0</commons-dbcp2.version><commons-lang3.version>3.12.0</commons-lang3.version><commons-pool.version>1.6</commons-pool.version><commons-pool2.version>2.9.0</commons-pool2.version><h2.version>1.4.200</h2.version><hibernate.version>5.4.32.Final</hibernate.version><hibernate-validator.version>6.2.0.Final</hibernate-validator.version><httpclient.version>4.5.13</httpclient.version><jackson-bom.version>2.12.4</jackson-bom.version><javax-jms.version>2.0.1</javax-jms.version><javax-json.version>1.1.4</javax-json.version><javax-websocket.version>1.1</javax-websocket.version><jetty-el.version>9.0.48</jetty-el.version><junit.version>4.13.2</junit.version>
</properties>

第二组是各式各样的依赖坐标信息,可以看出依赖坐标定义中没有具体的依赖版本号,而是引用了第一组信息中

定义的依赖版本属性值

<dependencyManagement><dependencies><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency></dependencies>
</dependencyManagement>

上面的依赖坐标定义是出现在标签中的,是对引用坐标的依赖管理,并不是实际使用的坐标。

因此当我们项目中继承了这组parent信息后,在不使用对应坐标的情况下,前面的这组定义是不会具体导入某个

依赖的。因为在maven中继承机会只有一次,上述继承的格式还可以切换成导入的形式进行。

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

三、提供 starter简化 Maven 配置

starter定义了使用某种技术时对于依赖的固定搭配格式,也是一种最佳解决方案,使用starter可以帮助开发者减

少依赖配置。项目中的pom.xml定义了使用SpringMVC技术,但是并没有写SpringMVC的坐标,而是添加了一

个名字中包含starter的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

在spring-boot-starter-web中又定义了若干个具体依赖的坐标

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.5.4</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-json</artifactId><version>2.5.4</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.5.4</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.9</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.9</version><scope>compile</scope></dependency>
</dependencies>

以 spring-boot-starter-json 为例,看看 starter 里面装的是什么?

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.5.4</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.9</version><scope>compile</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.4</version><scope>compile</scope></dependency><dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jdk8</artifactId><version>2.12.4</version><scope>compile</scope></dependency><dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId><version>2.12.4</version><scope>compile</scope></dependency><dependency><groupId>com.fasterxml.jackson.module</groupId><artifactId>jackson-module-parameter-names</artifactId><version>2.12.4</version><scope>compile</scope></dependency>
</dependencies>

可以发现,这个starter中又包含了若干个坐标,其实就是使用SpringMVC开发通常都会使用到Json,使用json又

离不开这里面定义的这些坐标,SpringBoot都给我们整合好了。

从而,得到了一个信息,使用starter可以帮开发者快速配置依赖关系。

以前写依赖3个坐标的,现在导入一个就搞定,极大的加速了依赖配置。

谨记:

所有的starter中都会依赖下面这个starter,叫做spring-boot-starter。

这个starter是所有的SpringBoot的starter的基础依赖,里面定义了SpringBoot相关的基础配置

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.5.4</version><scope>compile</scope>
</dependency>

四、自动配置 Spring(引导类)

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

SpringBoot本身是为了加速Spring程序的开发的,而Spring程序运行的基础是需要创建Spring容器对象(IoC容

器)并将所有的对象放置到Spring容器中管理,也就是一个一个的Bean。

改用 SpringBoot 就是为了加速开发Spring程序,当引导类运行后就会产生一个Spring容器对象,并且可以将这

个对象保存起来,通过容器对象直接操作Bean。

伪代码如下:

@SpringBootApplication
public class Springboot0101QuickstartApplication {public static void main(String[] args) {ConfigurableApplicationContext ctx = SpringApplication.run(Springboot0101QuickstartApplication.class, args);BookController bean = ctx.getBean(BookController.class);System.out.println("bean======>" + bean);User user = ctx.getBean(User.class);System.out.println(user);}}

通过上述操作不难看出,其实SpringBoot程序启动还是创建了一个Spring容器对象。

当前运行的这个类在SpringBoot程序中是所有功能的入口,称为引导类。

作为一个引导类最典型的特征就是当前类上方声明了一个注解@SpringBootApplication。

五、嵌入式 servlet 容器

当前我们做的SpringBoot入门案例勾选了Spring-web的功能,并且导入了对应的starter。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

要做web程序,肯定离不开使用web服务器,SpringBoot内置的web服务器帮我们减少了 Tomcat 的配置,打开

web对应的starter查看导入了哪些东西。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.5.4</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-json</artifactId><version>2.5.4</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.5.4</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.9</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.9</version><scope>compile</scope></dependency>
</dependencies>

第三个依赖就是tomcat对应的东西了,也有一个starter,打开看看。

<dependencies><dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>1.3.5</version><scope>compile</scope></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>9.0.52</version><scope>compile</scope><exclusions><exclusion><artifactId>tomcat-annotations-api</artifactId><groupId>org.apache.tomcat</groupId></exclusion></exclusions></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-el</artifactId><version>9.0.52</version><scope>compile</scope></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-websocket</artifactId><version>9.0.52</version><scope>compile</scope><exclusions><exclusion><artifactId>tomcat-annotations-api</artifactId><groupId>org.apache.tomcat</groupId></exclusion></exclusions></dependency>
</dependencies>

里面有一个核心的坐标,tomcat-embed-core,叫做tomcat内嵌核心。

就是这个东西把tomcat功能引入到了我们的程序中的。目前解决了第一个问题,找到根儿,那么谁把tomcat引入

到程序中的?

经过发现,是spring-boot-starter-web中的spring-boot-starter-tomcat做的。

居然什么都不做,就有了web服务器对应的功能。再来说第二个问题,这个服务器是怎么运行的。

内嵌Tomcat运行原理

Tomcat服务器是一款软件,而且是一款使用java语言开发的软件,熟悉tomcat的话应该知道tomcat安装目录中

保存有很多jar文件。既然是使用java语言开发的,运行的时候肯定符合java程序运行的原理,java程序运行靠的是

什么?对象呀,一切皆对象,万物皆对象。那tomcat运行起来呢?也是对象。

Spring容器就是用来管理对象的,这个对象能交给Spring容器管理,tomcat服务器自然而然就运行起来了,

Tomcat 运行其实就是以对象的形式在Spring容器中运行的。

<dependencies><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>9.0.52</version><scope>compile</scope></dependency>
</dependencies>

既然是个对象,如果把这个对象从Spring容器中去掉就说明会没有web服务器的功能。

可以通过依赖排除的方式去掉这个web服务器功能。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency>
</dependencies>

除了通过依赖排除的方式去掉这个web服务器功能,还可以更改 Servlet 容器。

其实,SpringBoot提供了3款内置的服务器:

  • tomcat(默认):apache出品,粉丝多,应用面广,负载了若干较重的组件
  • jetty:更轻量级,负载性能远不及tomcat
  • undertow:负载性能勉强跑赢tomcat

想用哪个,加个坐标就行。前提是要把默认的 tomcat 排除掉,因为tomcat是默认加载的。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency>
</dependencies>

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

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

相关文章

Jetson OrinNX平台CSI相机导致cpu load average升高问题调试

1. 前言 硬件: Orin NX JP: 5.1.2, R35.4.1 用v4l2-ctl --stream-mmap -d0 命令去获取相机数据时, 用top查看cpu使用情况, CPU占用率很低,但load average在1左右, 无任何程序运行时,load average 为0 用ps -aux 查看当前进程情况,发现有两个系统进程vi-output, …

Iceoryx2:高性能进程间通信框架(中间件)

文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例&#xff08;publisher.cpp&#xff09;3.2 订阅者示例&#xff08;subscriber.cpp&#xff09; 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…

获取Hive表备注

DESCRIBE EXTENDED 表名;先获取Detailed Table Information这行的data_type字段数据&#xff0c;进行正则匹配&#xff0c;拿到表备注&#xff0c;如下&#xff1a; String str ReUtil.get("parameters:\\{(?!.*?\\().*transient_lastDdlTime.*?comment(.*?)\\}&quo…

OTFS的基本原理(通俗易懂)

一、OTFS调制解调原理 Orthogonal Time Frequency Space Modulation | IEEE Conference Publication | IEEE Xplore OTFS原论文提出的方法可以概括为 可以概括为 Xdd (延迟多普勒域数据) ----> ISFFT(辛有限傅里叶变换) ---->海森堡变换 延迟多普勒域数据 …

数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和

生命的意义 在于活出自我 而不是成为别人眼中的你 —— 24.11.3 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 …

顺德自闭症全托管学校:专业照顾,细心呵护

在顺德及周边地区&#xff0c;寻找一所能够为自闭症儿童提供专业照顾与细心呵护的全托管学校&#xff0c;是许多家庭的迫切需求。自闭症儿童在社交、语言和行为上所面临的挑战&#xff0c;需要更为专业的教育环境和细致入微的关怀。而位于广州的星贝育园自闭症儿童寄宿制学校&a…

【react】基础知识点学习

1. 创建项目 npm install -g create-react-app npx create-react-app my-app cd my-app npm startindex.js为入口文件&#xff0c;App.js为根组件。 如何将react应用挂载在页面上&#xff1f; 将App组件渲染到id为root的DOM元素中 2. JSX JSX是|avaScript和XML(HTML)的缩写…

基于 JAVASSM 框架沙县小吃点餐系统

基于 JAVASSM 框架&#xff08;即 Java Spring Spring MVC MyBatis&#xff09;开发一个沙县小吃点餐系统。 步骤一&#xff1a;需求分析 明确系统需要实现的功能&#xff0c;比如&#xff1a; 用户注册和登录浏览菜单添加菜品到购物车下单并支付订单管理后台管理&#…

apt的编译安装(古老通讯)

Ubuntu系统的防火墙关闭&#xff1a; ufw disable 第一步&#xff1a;Ubuntu 安装依赖环境 apt -y install libpcre3-dev zlib1g-dev libssl-dev build-essential 如果出现无法下载则在末尾处假如 --fix missing如下图所示 出现下图则为安装成功 第二步&#xff1a; useradd…

基于微信小程序的校园失物招领系统的研究与实现(V4.0)

博主介绍&#xff1a;✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

有向无环图的拓扑排序——CSP-J1真题讲解

【题目】 考虑一个有向无环图&#xff0c;该图包括4条有向边&#xff1a;(1,2)&#xff0c;(1,3)&#xff0c;(2,4)&#xff0c;和(3,4)。以下哪个选项是这个有向无环图的一个有效的拓扑排序&#xff1f;&#xff08; &#xff09; A. 4, 2, 3, 1 B. 1, 2, 3, 4 C. 1, 2, 4…

selenium操作已开启的浏览器,方便调试

一、谷歌浏览器配置&#xff1a; 在所安装的谷歌下面&#xff0c;执行下面命令&#xff0c;打开谷歌浏览器&#xff0c;用来selenium的操作&#xff1a; 注意事项&#xff1a;端口需要不被占用&#xff0c;--user-data-dir"D:\workspace\chrome-data"这个路径需要有…

DAY75WEB 攻防-验证码安全篇接口滥用识别插件复用绕过宏命令填入滑块类

知识点&#xff1a; 1、验证码简单机制-验证码过于简单可爆破 2、验证码重复使用-验证码验证机制可绕过 3、验证码智能识别-验证码图形码被可识别 4、验证码接口调用-验证码触发接口可枚举 图片验证码-识别插件-登录爆破&接口枚举 验证码识别绕过等技术适用于&#x…

微信小程序生成二维码

目前是在开发小程序端 --> 微信小程序。然后接到需求&#xff1a;根据 form 表单填写内容生成二维码&#xff08;第一版&#xff1a;表单目前需要客户进行自己输入&#xff0c;然后点击生成按钮实时生成二维码&#xff0c;不需要向后端请求&#xff0c;不存如数据库&#xf…

海的回忆:海滨学院班级记忆录技术实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

注册页面设计(表单基础)

HTML表单是网页中用于收集用户输入信息的区域&#xff0c;它包含了一系列交互控件&#xff0c;允许用户输入数据&#xff0c;并将这些数据发送到Web服务器进行处理。以下是HTML表单的基础知识&#xff1a; 一、表单的基本结构 HTML表单由<form>标签定义&#xff0c;表单…

003-Kotlin界面开发之声明式编程范式

概念本源 在界面程序开发中&#xff0c;有两个非常典型的编程范式&#xff1a;命令式编程和声明式编程。命令式编程是指通过编写一系列命令来描述程序的运行逻辑&#xff0c;而声明式编程则是通过编写一系列声明来描述程序的状态。在命令式编程中&#xff0c;程序员需要关心程…

OPENAI官方prompt文档解析

官方文档地址:https://platform.openai.com/docs/guides/gpt-best-practices 文档中文版来源:OpenAI 官方提示工程指南 [译] | 宝玉的分享 (baoyu.io) 1.写清楚说明 如果prompt给的范围十分模糊或是过于宽泛,那么GPT就会开始猜测您想要的内容,从而导致生成的结果偏离预期. …

代理IP地址和端口是什么?怎么进行设置?

保护个人隐私、突破地域限制、提升网络安全性是我们不断追求的目标。而代理IP地址和端口就是一种实现这些目标的重要工具。但是&#xff0c;你可能对它是什么&#xff0c;以及如何设置感到困惑。别担心&#xff0c;本文将为你揭开这些神秘的面纱&#xff0c;让你轻松掌握这项技…

【uniapp3】分享一个自己写的h5日历组件

简言 分享一下自己基于uniapp写的日历组件。如果不太满足你的需求&#xff0c;可以自己改造。 日历 实现分析&#xff1a; 页面显示 - 分为顶部显示和日历显示&#xff0c;我这里做了多行和单行显示两种情况&#xff0c;主要是当时看着手机的日历做的&#xff0c;手机上的…