【基础篇】二、parent继承、starter、引导类、内嵌tomcat

2023-09-15 17:31:47


在这里插入图片描述

0、前言

SpringBoot,Boot,鞋子,其设计目的是用来简化Spring框架应用的初始搭建以及开发过程

Spring程序缺点:

  • 依赖设置繁琐(各个依赖之间版本的适配、依赖排除等活儿得自己调)
  • 配置繁琐

SpringBoot程序优点:

  • 起步依赖(简化依赖配置)
  • 自动配置(简化常用工程相关配置)
  • 辅助功能(内置服务器,……)

关于这三点,接下来分开说明。

1、继承parent

日常开发中,可能出现:有一个项目,里面两个模块都引用了以下相同的依赖:

在这里插入图片描述
首先想到的优化方案应该是,抽取一个公共的pom,再由这两个pom引入依赖:

在这里插入图片描述

再优化,公共的这个pom再拆,一个做版本管理,一个做依赖管理,这就是parent的雏形:

在这里插入图片描述

有了以上这个概念,再来看SpringBoot工程中的pom.xml文件,发现有一个spring-boot-starter-parent的Maven依赖继承:

在这里插入图片描述

跟进这个继承:

在这里插入图片描述

继续跟进,发现这里定义好了一系列的版本号(SpringBoot已经给user搭配好的一套依赖,使用2.6.11的SpringBoot,那底层搭配好的依赖的版本就是这些):

在这里插入图片描述

疑问:即使这里版本号已经有了,那也应该在自己的项目里dollar大括号取一下,为何可以直接写Maven的GA信息,而不要version坐标?

<!--如我们之前引入依赖是这么写的:(从不加version)-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

继续往下翻就会发现,这里不仅定义好了各个依赖的版本,还定义了依赖管理dependencyManagement,这就是我们不加坐标就能引入的原因:

在这里插入图片描述

细看使用阿里云版本的SpringBoot工程,发现并没有这个parent继承,但它在这里直接导入了SpringBoot的依赖配置,官网下创建的工程采用继承,阿里云下创建的则直接导入 ,效果都一样,不同形式而已。

在这里插入图片描述
到这儿,也可以得出结论,你所需要的那些依赖的版本,取决于SpringBoot的版本

小结:

  • 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突(版本的统一化管理
  • 继承parent的形式也可以采用引入依赖的形式实现效果

2、starter

一个starter的背后,包含了若干依赖,简单说就是你导入一个starter,相当于导入了好几个甚至几十个依赖,还是别人已经调好版本号的一组依赖。比如创建项目时勾选了Spring web而引入的spring-boot-starter-web,Ctrl跟进一下发现,它里面有spring-mvc、starter-tomcat等等:

在这里插入图片描述

如此,通过Maven依赖,就可以用一个starter来完成很多事。

starter是SpringBoot的常见项目名称,定义了当前项目于使用的所有依赖坐标,以达到减少依赖配置的目的。

注意starter和parent继承的关系:starter引入以后,starter背后的依赖就会传递给你的项目。但parent只是定义了若干个坐标版本号(做依赖管理,而不是依赖,即用不用随你,但你要是用的话,可以使用我搭配好的这个版本号),parent只是用来减少依赖冲突的!!! 一个是把饭直接喂你嘴里,一个是写了张纸条,告诉你饭在冰箱,别乱找东西吃。因此,在实际开发中:

  • 引入任意坐标时,使用Maven的GAV中的GA即可,除非SpringBoot未提供对应的版本V
  • 如发生坐标错误,再自己指定Version(小心依赖的版本冲突)

starter的小结:

  • 开发SpringBoot程序需要导入坐标时通常导入对应的starter
  • 每个不同的starter根据功能不同,通常包含多个依赖坐标(依赖传递)
  • 使用starter可以实现快速配置的效果,达到简化配置的目的

3、引导类

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

  • SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
  • SpringBoot工程运行后初始化Spring容器扫描并加载引导类所在包路径下的bean

另外,run方法的返回值是一个ConfigurableApplicationContext,其最上层父类就是ApplicationContext -> BeanFactory

在这里插入图片描述

因此,可以直接在这里通过IoC容器获取Bean(后面源码篇再整理):

在这里插入图片描述

4、内嵌tomcat

看之前创建项目时勾选spring-web而导入的依赖spring-boot-starter-web,跟进看到tomcat的起步依赖:

在这里插入图片描述

再跟进,看下tomcat starter背后的依赖,有个tomcat-embed-core,即tomcat的内嵌核心…

在这里插入图片描述

排除掉tomcat的starter,看下没有tomcat服务器的启动效果:

在这里插入图片描述

此时再调接口,自然不能响应了。在引入一个别的web服务器的起步依赖:

在这里插入图片描述

此时一切正常,控制台可看到内置jetty服务器的信息。最后,关于SpringBoot中内置的三款web服务器:

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

变更内嵌服务器思想是去除现有服务器,添加全新的服务器。

内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理

5、SpringBoot项目快速启动

在这里插入图片描述

前后端每次联调,若都等待后端来启动服务,则很不方便,而SpringBoot项目支持快速启动,拿着jar包在JDK环境下就能运行:

STEP1:对SpringBoot项目打包,mvn package

在这里插入图片描述

STEP2:在target目录下找到jar包

在这里插入图片描述

STEP3:打开DOS窗口,执行启动指令:java -jar xxx.jar
在这里插入图片描述
在这里插入图片描述

STEP4:测下效果

在这里插入图片描述


注意,不是所有的jar包都可以这样快速启动,上面成功是因为SpringBoot对应的maven插件,生成了一个Fat-jar,具体原理看这篇【SpringBoot-Q5】

在这里插入图片描述

更多推荐

锂离子电池和电池组安全使用指南

声明本文是学习GB-T42729-2023锂离子电池和电池组安全使用指南.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们1范围本文件提供了锂离子电池和电池组使用过程中的安全指导和建议,给出了锂离子电池和电池组制造厂商向用户提供可能发生危险的相关信息。本文件适用于锂离子电池和电池组的使用。2规范性引

系统架构设计师(第二版)学习笔记----信息安全基础知识

【原文链接】系统架构设计师(第二版)学习笔记----信息系统基础文章目录一、信息安全的概念1.1信息安全的基本要素1.2信息安全的内容1.3设备安全的内容1.4数据安全的内容1.5内容安全的含义1.6行为安全的含义二、信息存储安全2.1信息存储安全的内容有:2.2信息使用安全的内容2.3用户的标识与验证方法2.4用户存

【Docker】Docker安全性与安全实践(五)

前言:Docker安全性的作用和意义在于确保容器化应用程序和镜像的隔离性、保护数据和系统资源、防止恶意攻击,以及提高应用的整体安全性。文章目录1.Docker安全性1.1`隔离性`1.2`镜像安全`1.3`特权访问`1.4`数据保护`2.Docker安全实践2.1`使用官方镜像或可信源`2.2`更新和修补镜像`2.3`

【Rust 基础篇】Rust中的不安全函数:解锁系统级编程的黑盒之门

导言Rust是一种以安全性和高效性著称的系统级编程语言。它的设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。为了实现这一目标,Rust引入了"借用检查器"和"所有权系统"等特性,有效地避免了空指针、数据竞争等常见的安全问题。然而,有些场景下,为了完成某些高级操作或者与底层交互,Rust需要突破其安全边界。

工业交换机为什么有必要进行老化测试?

我们可以根据客户的要求来制定老化测试的检测标准,如果没有特别的要求,我们将依照国家相应的标准进行老化测试检验。老化测试的主要目的是通过模拟产品在现实使用过程中所面临的各种恶劣条件,对产品进行高强度的测试。同时,根据产品的使用要求,合理预测其使用寿命。老化测试是为了确保产品达到满意的合格率,几乎所有产品在出厂前都必须经过

Golang使用Channel

1.使用协程packagemain//使用协程import("fmt""strconv""time")functest(){fori:=1;i<=10;i++{fmt.Println("test()helloworld"+strconv.Itoa(i))time.Sleep(time.Second)}}//主线程和te

开源与区块链:去中心化的未来

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

ddns有什么作用?无公网IP怎么将内网IP端口映射外网访问

DDNS是什么?DDNS英文全称DynamicDomainNameServer,中文含义是指动态域名服务。很多普通路由器或者智能路由器设置中,都可以找到DDNS(动态DNS)功能。上面的解释可能过于专业,其实DDNS通俗点说,它是一种将用户的动态IP地址映射到一个固定的域名解析服务上的功能,因为现在目前大多数路由器拨号

如何将内网ip映射到外网?快解析内网穿透

关于内网ip映射到外网的问题,就是网络地址转换,私网借公网。要实现这个,看起来说得不错,实际上是有前提条件的。要实现内网ip映射到外网,首先要有一个固定的公网IP,可以从运营商那里得到。当你得到公网IP后,你的私网有可能有多台主机,都要挂到公网上,这时候会用到DMZ。比如,你有一个公网IP,也可能是通过快解析等得到,你

R语言绘制PCA双标图、碎石图、变量载荷图和变量贡献图

1、原论文数据双标图代码:setwd("D:/Desktop/0000/R")#更改路径#导入数据df<-read.table("Inputdata.csv",header=T,sep=",")#-----------------------------------#所需的包:packages<-c("ggplot2"

网络监控应用程序

在过去的几十年中,网络监控应用稳步发展,以适应不断变化的市场需求和期望。多年来,停机成本飙升,客户对停机的耐心比以往任何时候都低,不仅仅是正常运行时间,正常运行时间的质量也变得很重要。另一个发展是网络的复杂性日益增加。现代网络监控应用程序必须优化云原生、基于云的和整合环境的性能。对现代网络监控软件的期望网络监控工具有望

热文推荐