实用指南:【SpringBoot】26 核心功能 - Web开发原理 - Spring Boot 中定制 Servlet 容器

news/2025/9/21 18:26:27/文章来源:https://www.cnblogs.com/wzzkaifa/p/19103955

文章目录

        • 一、原理剖析
        • 二、定制 Servlet 容器的多元方式
          • 1. 切换嵌入式 Servlet 容器
          • 2. 实现 `WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>`
          • 3. 直接自定义 `ConfigurableServletWebServerFactory`


一、原理剖析

在 Spring Boot 的生态体系中,当涉及到 Web 应用开发时,其内部对于 Servlet 容器的管理和运作有着一套精心设计的机制。

当我们引入 Spring Boot 的 web 场景包时,它会悄然将 Tomcat 相关依赖纳入项目。Spring Boot 应用启动伊始,会敏锐地察觉当前是 Web 应用场景,随后便将 web 场景包与 Tomcat 进行深度整合。

具体而言,Web 应用会构建一个特殊的 IOC 容器——ServletWebServerApplicationContext。这个容器在启动过程中,肩负着一个关键使命:寻找 ServletWebServerFactoryServletWebServerFactory 就像是 Servlet 的 web 服务器工厂,它的核心职责是创建 Servlet 所依赖的 web 服务器。

在 Spring Boot 的底层架构中,默认支持多种流行的嵌入式 Servlet 容器,如 Tomcat、Jetty 或 Undertow。针对不同的容器,分别有对应的工厂类,例如 TomcatServletWebServerFactoryJettyServletWebServerFactoryUndertowServletWebServerFactory

这一机制的背后,离不开自动配置类的默默支持。ServletWebServerFactoryAutoConfiguration 这个自动配置类,导入了 ServletWebServerFactoryConfiguration 配置类。ServletWebServerFactoryConfiguration 犹如一个智能的决策者,它会根据项目中实际引入的 Web 服务器包进行动态判断。默认情况下,由于 web - starter 会导入 tomcat 包,所以它会自动选择并配置 TomcatServletWebServerFactory。以 TomcatServletWebServerFactory 为例,它会负责创建 Tomcat 服务器实例,并通过其构造器中的初始化方法 initialize,调用 this.tomcat.start() 来启动内嵌的 Tomcat 服务器(前提是项目中存在 tomcat 核心 jar 包)。

二、定制 Servlet 容器的多元方式
1. 切换嵌入式 Servlet 容器

Spring Boot 赋予了我们灵活切换嵌入式 Servlet 容器的能力。默认支持 Tomcat、Jetty 或 Undertow 这几种常见的容器。ServletWebServerApplicationContext 容器在启动流程中,会主动寻找 ServletWebServerFactory,并引导其创建对应的服务器实例。

在实际项目中,如果我们希望将默认的 Tomcat 容器切换为 Jetty,可以通过对项目依赖进行巧妙调整来实现。在 Maven 构建的项目的 pom.xml 文件中,我们可以利用 <exclusions> 标签,将 spring - boot - starter - tomcat 依赖排除在外,随后引入 spring - boot - starter - jetty 依赖。示例代码如下:

<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>

通过这样的依赖配置调整,Spring Boot 在启动时就会识别到 Jetty 相关的依赖,进而使用 JettyServletWebServerFactory 来创建并启动 Jetty 服务器,实现容器的无缝切换。

2. 实现 WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>

除了切换容器类型,我们还可以对 Servlet 容器进行更为细致的定制化配置。实现 WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> 接口就是一种常见且有效的方式。

我们可以创建一个专门的配置类来实现该接口,在 customize 方法中对 ConfigurableServletWebServerFactory 进行个性化设置。例如,我们可以对服务器的端口、上下文路径、会话超时时间等参数进行调整。以下是一个示例代码:

import org.springframework.boot.web.server.ConfigurableServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;
@Component
public class MyWebServerFactoryCustomizer
implements WebServerFactoryCustomizer<
ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
// 设置服务器端口为 8081
factory.setPort(8081);
// 设置应用的上下文路径为 /myapp
factory.setContextPath("/myapp");
// 设置会话超时时间为 1800 秒
factory.setSessionTimeout(1800);
}
}

在上述代码中,customize 方法接收一个 ConfigurableServletWebServerFactory 参数,通过调用其提供的一系列设置方法,我们可以轻松地对 Servlet 容器的各项参数进行定制。这种方式的好处在于,它能够以一种较为统一和便捷的方式,对容器的配置进行集中管理。

3. 直接自定义 ConfigurableServletWebServerFactory

对于一些更为复杂和特殊的定制需求,直接自定义 ConfigurableServletWebServerFactory 的实现类可能是更好的选择。

我们可以创建一个新的配置类,在其中通过 @Bean 注解定义一个 ConfigurableServletWebServerFactory 的实例,并进行详细的配置。例如,以下代码展示了如何创建一个自定义的 Tomcat 服务器工厂配置:

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebServerConfig
{
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
// 设置服务器端口为 8082
factory.setPort(8082);
// 设置应用的上下文路径为 /customapp
factory.setContextPath("/customapp");
// 可以在这里添加更多针对 Tomcat 的特殊配置,例如连接器配置等
// 例如设置 Tomcat 的连接器属性
// factory.addConnectorCustomizers(connector -> {
// connector.setProperty("maxThreads", "200");
// });
return factory;
}
}

在这个示例中,我们创建了一个 TomcatServletWebServerFactory 的实例,并对其端口和上下文路径进行了设置。此外,我们还可以通过 addConnectorCustomizers 等方法,对 Tomcat 的连接器等底层组件进行更为精细的配置,以满足一些特殊的业务需求。

通过以上多种方式,我们能够在 Spring Boot 项目中对嵌入式 Servlet 容器进行全方位、多层次的定制。无论是简单的容器类型切换,还是对容器参数的细致调整,亦或是针对特定容器的深度定制,Spring Boot 都提供了相应的机制和接口,帮助我们打造出符合项目需求的 Web 服务器环境。这使得我们在开发 Spring Boot Web 应用时,能够更加灵活地应对各种复杂的业务场景。

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

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

相关文章

实用指南:山东大学《Web数据管理》期末复习宝典【万字解析!】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

03_Angular的突破性优势

第一部分:为什么选择 Angular v20?—— 框架核心优势解析 在前端框架百花齐放的今天,选择合适的技术栈已成为项目成功的关键前提。Angular v20 凭借其独特的设计理念和技术特性,在企业级应用开发中展现出不可替代的…

02_Angular现代前端框架的选型逻辑

第一部分:为什么选择 Angular v20?—— 框架核心优势解析 在前端框架百花齐放的今天,选择合适的技术栈已成为项目成功的关键前提。Angular v20 凭借其独特的设计理念和技术特性,在企业级应用开发中展现出不可替代的…

01_Angular时代的前端开发变革

前言:Angular v20 时代的前端开发变革 前端技术的迭代速度从未像今天这样迅猛,而在众多框架中,Angular 始终以"企业级应用首选"的定位稳步进化。从 2010 年 AngularJS(v1)的诞生到 2024 年 Angular v20…

一堆杂题混刷

P6359(绿,DP) 题意: 有 \(n\) 台计算机,每台由三元组 \((c_i, f_i, v_i)\) 描述,分别表示核心数、时钟频率、购买价格。 有 \(m\) 个客户订单,每个订单由三元组 \((C_j, F_j, V_j)\) 描述,分别表示所需核心数、…

QQ 陌生人点赞 功能存在隐私泄露风险

QQ 陌生人点赞 功能存在隐私泄露风险QQ空间 陌生人点赞 功能存在隐私泄露风险 声明:本文仅用于技术研究与安全防护知识分享,严禁任何个人或组织利用文中提及的途径进行非法操作或骚扰他人! 案例一 案例二 漏洞原理 …

Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商资料

Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商资料pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

2025 CCPC 网络赛

C. 造桥与砍树 魔改 prim。回顾经典的prim算法,从第一个点开始,每次找权值最小的边加入,然后更新到每个点的距离和边的起点,以此往复。对于这道题来讲,每次更新到其他 \(n-1\) 个点的最小权值显然复杂度太大,但按…

安装windows11跳过账户登录

这个最快!!能跳过obbe start ms-cxh:localonlyWindows 11 跳过强制登录微软账户的方法方法1:使用错误的邮箱和密码。比如使用1@1.com,密码随便输入。 方法2:用快捷键“shift+F10”调出CMD命令窗口,输入“star…

TCM安全学院夏季大促与免费网络安全课程发布

TCM安全学院发布安德鲁贝利尼的紧急消息,宣布夏季大促活动,提供网络安全认证和培训折扣,以及新发布的免费网络安全入门课程,适合初学者学习渗透测试和黑客技术。最后听到安德鲁的消息!:face_screaming_in_fear: 点…

博客园插入bilibili视频

默认的<!--第三方:会自动播放--> <iframe src="https://xbeibeix.com/api/bilibili/biliplayer/?url=https://www.bilibili.com/video/BV1Fz4y1f7Wc" scrolling="no" border="0&q…

软件工程第一次编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477这个作业的目标 实…

WO Mic - 免费麦克风

WO Mic可以将您的手机变成电脑麦克风。您无需支付一分钱购买任何设备。如果您选择无线传输,它也是便携的。数百万用户已经安装并每天都在使用它进行通话、录音、语音遥控等活动。 三大组件协同工作以实现这一点:WO M…

AudioRelay —— 让电脑使用手机的麦克风和扬声器

写在前面 总所周知,电脑的麦克风和扬声器一直是很垃圾的水平,和手机相比差了很多,那能不能使用手机的硬件设备来给电脑使用呢,也能省个音箱的钱呢?答案是可以的。那就是使用AudioRelay。前段时间介绍了WO Mic,他…

【小白学算法】矩阵快速幂超详细解析+例题[HDU - 2802]

用于高效解决线性递推问题 前言 在算法竞赛和实际编程中,我们经常遇到需要计算矩阵的高次幂的问题。如果直接用朴素的矩阵乘法来计算,时间复杂度会达到O(n k),其中n是矩阵的维度,k是幂次。当k非常大时(比如\(10^…

lyms 的神秘歌单

关于这个闲话。还有 50 min 就要回 whk 了,我们可以干点什么呢?wy_x and lyms : 写闲话!所以就写。 说实在的根本不知道能写什么。 要不然给自己喜欢的曲子列个列表。 就当是什么神秘歌单了。 update on 9.21 推什么…

大学园区二手书交易强大的平台(代码+数据库+LW)

大学园区二手书交易强大的平台(代码+数据库+LW)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

深入解析:SpringMVC的请求接收与结果响应

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Element UI框架中自定义input组件的placeholder样式

Element UI是基于Vue.js的组件库,提供了一系列的组件,方便在Vue应用程序中快速使用。对于自定义input组件的placeholder样式,可以通过CSS覆盖默认样式来实现。以下是对Element UI中input组件的placeholder样式自定义…

go语言数组的方法

go语言数组的方法 漫思