当前位置: 首页 > news >正文

SpringBoot集成Tomcat服务

文章目录

  • 一、Tomcat集成
    • 1、依赖层级
    • 2、自动化配置
  • 二、Tomcat架构
  • 三、Tomcat配置
    • 1、基础配置
    • 2、属性配置类
    • 3、配置加载分析
  • 四、周期管理方法
    • 1、控制类
    • 2、核心方法

使用的成本越低,内部封装越复杂;

一、Tomcat集成

1、依赖层级

在SpringBoot框架的web依赖包中,引入的是内嵌Tomcat组件,基于SpringBoot的版本,Tomcat集成的是9.0版本;

<!-- 1、项目工程依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.5.RELEASE</version>
</dependency><!-- 2、starter-web依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.2.5.RELEASE</version><scope>compile</scope>
</dependency><!-- 3、starter-tomcat依赖 -->
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>9.0.31</version><scope>compile</scope>
</dependency>

2、自动化配置

在SpringBoot框架的自动配置类中,Web项目中不显式更换其他服务依赖时,默认提供了对Tomcat服务的管理;

@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,ServletWebServerFactoryConfiguration.EmbeddedTomcat.class})
public class ServletWebServerFactoryAutoConfiguration {@Bean@ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(ServerProperties serverProperties) {return new TomcatServletWebServerFactoryCustomizer(serverProperties);}
}

二、Tomcat架构

Server:代表整个Tomcat容器;

Service:服务器内部的中间组件,将一个或多个Connector绑定到一个Engine上;

Engine:表示特定服务的请求处理管道,接收Connector的请求并响应;

Host:网络主机名称;

Connector:连接器处理与客户端的通信;

Context:代表一个Web应用程序的上下文;

参考Tomcat9.0版本的核心组件描述,对于框架有大致的了解后,再去分析集成原理,会更容易把握主线逻辑;

三、Tomcat配置

1、基础配置

在配置文件中,对Tomcat做一些基础性的设置,查看下面的配置类可以知道,这些属性存在默认值;

server:port: 8082                # 端口号tomcat:                   # Tomcat组件uri-encoding: UTF-8     # URI编码max-threads: 100        # 最大工作线程min-spare-threads: 10   # 最小工作线程

2、属性配置类

在服务配置中,提供多种服务器的适配,像Tomcat、Jetty、Netty、Undertow,从策略上看,配置分为公共属性以及各种服务器的适配属性;

更多配置信息,可以参考完整的源码和注释说明;

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {private Integer port;public static class Tomcat {private Charset uriEncoding = StandardCharsets.UTF_8;private int maxThreads = 200;private int minSpareThreads = 10;}
}

3、配置加载分析

  • 基于配置的属性,定制化管理Tomcat服务的信息;
public class TomcatWebServerFactoryCustomizerimplements WebServerFactoryCustomizer<ConfigurableTomcatWebServerFactory> {@Overridepublic void customize(ConfigurableTomcatWebServerFactory factory) {ServerProperties properties = this.serverProperties;ServerProperties.Tomcat tomcatProperties = properties.getTomcat();PropertyMapper propertyMapper = PropertyMapper.get();customizeStaticResources(factory);}
}
  • TomcatWeb服务工厂,这里在创建WebServer时,使用的是Tomcat,需要适当的了解一下Tomcat架构;
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactoryimplements ConfigurableTomcatWebServerFactory, ResourceLoaderAware {@Overridepublic WebServer getWebServer(ServletContextInitializer... initializers) {Tomcat tomcat = new Tomcat();Connector connector = new Connector(this.protocol);connector.setThrowOnFailure(true);tomcat.getService().addConnector(connector);customizeConnector(connector);tomcat.setConnector(connector);tomcat.getHost().setAutoDeploy(false);configureEngine(tomcat.getEngine());prepareContext(tomcat.getHost(), initializers);return getTomcatWebServer(tomcat);}
}

四、周期管理方法

1、控制类

  • WebServer的简单接口,只声明端口获取,服务启动和停止相关方法;
public interface WebServer {// 获取监听的端口int getPort();// 服务启动void start() throws WebServerException;// 服务停止void stop() throws WebServerException;
}
  • SpringBoot中,Tomcat服务核心控制类,通过TomcatServletWebServerFactory工厂类创建,对Tomcat生命周期的管理提供了一层包装;
public class TomcatWebServer implements WebServer {private final Tomcat tomcat;private final Map<Service, Connector[]> serviceConnectors = new HashMap<>();
}
  • Apache组件中,轻量级Tomcat启动器,提供了Tomcat基础配置,比如默认的Port和HostName,以及生命周期管理的方法,TomcatWebServer类中调用的就是该API中的具体方法;
public class Tomcat {protected Server server;protected int port = 8080;protected String hostname = "localhost";// 初始化服务public void init() throws LifecycleException {getServer();server.init();}// 启动服务public void start() throws LifecycleException {getServer();server.start();}// 停止服务public void stop() throws LifecycleException {getServer();server.stop();}
}

2、核心方法

2.1 初始化,初始化时,调用Apache-Tomcat类中启动方法;

public class TomcatWebServer implements WebServer {/*** 初始化方法*/private void initialize() throws WebServerException {// 控制台日志logger.info("Tomcat initialized with port(s): " + getPortsDescription(false));synchronized (this.monitor) {// 调用Apache-Tomcat类中启动方法this.tomcat.start();}}
}

2.2 启动,在初始化的方法中,调用的Tomcat启动方法,这里对状态进行校验并输出日志;

public class TomcatWebServer implements WebServer {/*** 启动方法*/public void start() throws WebServerException {synchronized (this.monitor) {if (this.started) {return;}checkThatConnectorsHaveStarted();// 启动状态的标识this.started = true;// 控制台日志logger.info("Tomcat started on port(s): " + getPortsDescription(true) + " with context path '"+ getContextPath() + "'");}}
}

2.3 停止,在组件生命周期的常规管理逻辑中,停止服务之后进行销毁动作的执行,其中自然涉及到多个状态标识的转换;

public class TomcatWebServer implements WebServer {/*** 停止方法*/public void stop() throws WebServerException {synchronized (this.monitor) {// 状态变化boolean wasStarted = this.started;this.started = false;// Tomcat服务停止stopTomcat();this.tomcat.destroy();}}
}

ENDENDEND

相关文章:

SpringBoot集成Tomcat服务

文章目录一、Tomcat集成1、依赖层级2、自动化配置二、Tomcat架构三、Tomcat配置1、基础配置2、属性配置类3、配置加载分析四、周期管理方法1、控制类2、核心方法使用的成本越低&#xff0c;内部封装越复杂&#xff1b; 一、Tomcat集成 1、依赖层级 在SpringBoot框架的web依赖…...

【机器学习】决策树-C4.5算法

1.C4.5算法 C4.5算法与ID3相似&#xff0c;在ID3的基础上进行了改进&#xff0c;采用信息增益比来选择属性。ID3选择属性用的是子树的信息增益&#xff0c;ID3使用的是熵&#xff08;entropy&#xff0c; 熵是一种不纯度度量准则&#xff09;&#xff0c;也就是熵的变化值&…...

actipro-winforms-controls-23.1.0 Crack

actipro-winforms一组用于构建漂亮的 Windows 窗体桌面应用程序的 UI 控件&#xff0c;用于构建 IDE 的高级停靠窗口、MDI、属性网格、树控件和文件夹/文件浏览器&#xff0c;用于常见数据类型、自动完成、屏蔽编辑和代码编辑的强大编辑器&#xff0c;功能区、图表、微型图表、…...

适合打游戏用的蓝牙耳机有哪些?吃鸡无延迟的蓝牙耳机推荐

现在手游的兴起&#xff0c;让游戏市场变得更加火爆&#xff0c;各种可以提高玩家体验的外设也越来越多&#xff0c;除了提升操作的外置按键与手柄外&#xff0c;能带来更出色音质与舒心使用的游戏耳机&#xff0c;整体氛围感更好&#xff0c;让玩家在细节上占据优势&#xff0…...

1000:入门测试题目[不一样的题解][85种写法]【A+B问题】

题目&#xff1a; 1000&#xff1a;入门测试题目 时间限制: 1000 ms 内存限制: 32768 KB 提交数: 262857 通过数: 158152 【题目描述】 求两个整数的和。 【输入】 一行&#xff0c;两个用空格隔开的整数。 【输出】 两个整数的和。 【输入样例】 2 3 【输出样例】…...

FastReport .NET 2023.1.13 Crack

FastReport .NET 使用来自 ADO .NET 数据源的数据。它可以排序和过滤数据行&#xff0c;使用主从关系和查找数据列。一切都可以通过点击几下鼠标来完成。 直接连接到 ADO、MS SQL 或基于 xml 的数据库。其他连接器可作为插件使用。 能够从 IEnumerable 类型的业务对象中获取数…...

unzip: cannot find zipfile directory in one of

下面是执行flutter doctor 后报错内容 End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last …...

RFC4543: Galois Message Authentication Code (GMAC);CONFIG_CRYPTO_GCM

在2010年这个算法被Linux社区加进来:说明算法还是挺重要,普遍使用。 commit 73c89c15b959adf06366722c4be8d2eddec0a529 Author: Tobias Brunner <tobias@strongswan.org> Date: Sun Jan 17 21:52:11 2010 +1100crypto: gcm - Add RFC4543 wrapper for GCMThis patc…...

【YOLOv5】 02-标注图片,训练并使用自己的模型

在上一篇文章中&#xff0c;我们完成了YOLOv5的安装和测试。如果想检测自定义目标&#xff0c;就需要用到LabelImg来对图片打标签&#xff0c;本篇文章介绍了LabelImg安装与使用&#xff0c;以及如何训练并使用自己的模型。一、安装LabelImg输入如下命令进行安装&#xff1a;pi…...

2023.2.15日学习内容(用户的增删改查)

1&#xff0c;如果前端时间需要年月日&#xff0c;不需要时分秒&#xff0c;则一般情况下再数据库里面操作即可2.正常情况下&#xff0c;以后所有的查询都不能用* 查询所有列3.删除思路逻辑1&#xff09;点击删除按钮需要对其进行监听2&#xff09;对于重要的信息删除应该给用户…...

车载以太网 - 测试用例设计 - 时间参数 - 11

前面已经介绍过DoIP相关的时间参数信息,然而对于时间参数信息相关的测试用例该如何设计呢?个人认为这是用例中最好设计的一类,这类的用例只需要按照定义去设计写测试用例即可,难的是自动化脚本开发和手动测试执行。毕竟时间参数一般都是毫秒级的验证,就算是秒级的我们也很…...

【C#个人错题笔记】

观前提醒 记录一些我不会或者少见的内容&#xff0c;不一定适合所有人 字符串拼接 int a3,b8; Console.WriteLine(ab);//11 Console.WriteLine("ab");//ab Console.WriteLine(a""b);//38 Console.WriteLine("ab"ab);//ab38 Console.WriteLine…...

JavaScript刷LeetCode拿offer-树的遍历

什么是树 一种分层数据的抽象模型。前端工作中常见的树包括&#xff1a;DOM树&#xff0c;级联选择&#xff0c;树形控件JS中没有树&#xff0c;可以用Object和Array构建树树的常用操作&#xff1a;深度/广度优先遍历&#xff0c;先中后序遍历 深度优先遍历 访问根节点对根节…...

《FPGA学习》->呼吸灯

&#x1f34e;与其担心未来&#xff0c;不如现在好好努力。在这条路上&#xff0c;只有奋斗才能给你安全感。你若努力&#xff0c;全世界都会为你让路。呼吸灯&#xff0c;简而言之就像人类呼吸一样&#xff0c;有节奏的让LED灯从&#xff1a;灭->微微亮->微亮->亮-&g…...

【大数据离线开发】7.4 HBase数据保存和过滤器

7.4 数据保存的过程 注意&#xff1a;数据的存储&#xff0c;都需要注意Region的分裂 HDFS&#xff1a;数据的平衡 ——> 数据的移动&#xff08;拷贝&#xff09;HBase&#xff1a;数据越来越多 ——> Region的分裂 ——> 数据的移动&#xff08;拷贝&#xff09; …...

CentOS7安装MariaDB步骤

文章目录1.配置MariaDB yum源2.安装MariaDBMariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可。 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;使之能轻松成为MySQL的代替品。 CentOS 6 或早期的版…...

软件测试13个最容易犯的错误

目录 一、 输入框测试 二、 搜索功能测试 三、 添加/修改功能 四、 删除功能 五、 上传图片功能测试 六、 查询结果列表 七、 返回键检查 八、 回车键检查 九、 刷新键检查 十、 直接URL链接检查&#xff08;盗链问题&#xff09; 十一、并发问题 十二、 业务流程测…...

华为OD机试真题Java实现【5键键盘的输出】真题+解题思路+代码(20222023)

🔥系列专栏 华为OD机试(Python)真题目录汇总华为OD机试(JAVA)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出描述:示例1:示例2:解题思路代码实现运行结果:版权说明:题目...

化解射频和微波设计挑战的六个技巧

即使是最自信的设计人员&#xff0c;对于射频电路也往往望而却步&#xff0c;因为它会带来巨大的设计挑战&#xff0c;并且需要专业的设计和分析工具。这里将为您介绍六条技巧&#xff0c;来帮助您简化任何射频PCB 设计任务和减轻工作压力&#xff01; 1、保持完好、精确的射频…...

linux内核—进程调度(核心)

目录 核心函数__schedule() 处理过程 1、选择下一个进程 2、切换线程 1&#xff09;切换进程的虚拟地址空间 2&#xff09;切换寄存器 3&#xff09;执行清理工作 核心函数__schedule() 主要的调度程序 进入次函数的主要方法是&#xff1a; 1、显示阻塞&#xff1a;互…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...