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

重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类

  • 工作原理
  • 关键组件
  • 以TomcatServletWebServerFactory为例
    • ServletWebServerFactory会创建webServer的时机
    • 关键特性
    • 使用方式
      • 通过配置文件
      • 通过编程方式定制
  • 结论

在Spring Boot 3中,ServletWebServerFactoryAutoConfiguration 类扮演着至关重要的角色,它负责自动配置内嵌的 Servlet 容器,例如 Tomcat、Jetty 或 Undertow。这种自动配置能力是 Spring Boot 框架的核心特性之一,它极大地简化了 Spring 应用的开发和部署过程。本文将深入探讨ServletWebServerFactoryAutoConfiguration 类的工作原理、配置方式以及如何通过它来定制内嵌Servlet容器。

工作原理

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

ServletWebServerFactoryAutoConfiguration类位置

ServletWebServerFactoryAutoConfiguration 类通过 Spring 的条件注解机制(如 @ConditionalOnClass@ConditionalOnMissingBean 等)来检测 classpath 中可用的 Servlet 容器实现,并据此配置相应的 ServletWebServerFactory 实例。这个工厂实例负责创建和配置内嵌的Servlet容器,并且绑定了ServerProperties 配置类,所有和服务器有关的配置既以 server. 开头的配置。

关键组件

ServletWebServerFactoryAutoConfiguration 配置了一系列的工厂 Bean,这些工厂 Bean 基于应用的依赖和属性进行条件化的配置。主要包括:

  • TomcatServletWebServerFactory
  • JettyServletWebServerFactory
  • UndertowServletWebServerFactory

每个工厂都对应一个特定的 Servlet 容器实现,它们提供了丰富的配置选项,允许开发者定制容器的行为,如端口号、SSL配置、会话设置等。

以TomcatServletWebServerFactory为例

TomcatServletWebServerFactory 是一个非常关键的类,它负责为 Spring Boot 应用配置和创建内嵌的 Tomcat 服务器。这一工厂类使得开发者能够轻松地定制Tomcat 服务器的各种设置,如端口号、SSL 配置、会话超时设置、以及其他多项服务器级别的配置。通过使用 TomcatServletWebServerFactory,开发者可以在不牺牲 Spring Boot 应用简易性和速度的前提下,享受到强大的 Tomcat 服务器定制功能。

ServletWebServerFactory会创建webServer的时机

我们倒着来看。

TomcatServletWebServerFactory 有 getWebServer() 方法,是用来创建和配置 Tomcat Web 服务器的。

org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory#getWebServer

getWebServer()

按住 Ctrl+左键,显示的是 ServletWebServerApplicationContext 的 createWebServer() 调用了 getWebServer 方法,它检查 webServer 和 servletContext 是否为 null。如果都为 null,那么它将创建一个新的 WebServer 实例,并将其注册到 BeanFactory 中,以便在需要时可以获取。同时,它还会创建两个生命周期 bean,一个用于优雅地关闭 Web 服务器,另一个用于启动和停止 Web 服务器。

org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#createWebServer

createWebServer()方法

按住 Ctrl+左键,显示的是 ServletWebServerApplicationContext 的 onRefresh() 调用了 createWebServer() 方法,onRefresh() 又是由 AbstractApplicationContext 调用,既 Spring容器启动的时候,找了个时机创建 webServer。

org.springframework.context.support.AbstractApplicationContext#onRefresh

onRefresh()

关键特性

TomcatServletWebServerFactory 提供了以下几个关键特性来帮助开发者定制内嵌 Tomcat 服务器:

  • 端口配置:可以设置 HTTP 和 HTTPS 的端口,支持程序运行时动态更改端口。
  • SSL配置:支持 SSL/TLS 设置,让开发者可以配置HTTPS安全连接。
  • 会话管理:允许开发者定制会话超时时间、会话持久化机制等。
  • 错误页面:可以定制错误页面来优化用户体验。
  • 连接器和协议定制:支持对 Tomcat 连接器(Connector)和协议的高级定制,包括线程池配置、连接超时设置等。

使用方式

在 Spring Boot 应用中,通常不需要直接实例化 TomcatServletWebServerFactory。相反,可以通过 application.properties 或 application.yml 文件进行配置,或者通过编程方式定制 Tomcat 的特定行为。

通过配置文件

application.propertiesapplication.yml中添加 Tomcat 的配置,例如:

# application.properties
server.port=8080
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=password
server.ssl.keyStoreType=JKS
server.servlet.session.timeout=20m

通过编程方式定制

如果需要更高级的定制,可以创建一个配置类并注入 TomcatServletWebServerFactory 的 Bean,示例如下:

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 TomcatConfig {@Beanpublic WebServerFactoryCustomizer<TomcatServletWebServerFactory> webServerFactoryCustomizer() {return factory -> {factory.setPort(8080);// 其他定制...};}
}

结论

ServletWebServerFactoryAutoConfiguration 类是 Spring Boot 自动配置内嵌 Servlet 容器的关键,它极大地简化了开发和部署过程。通过灵活的配置选项,开发者可以轻松定制容器的行为,以满足不同的应用需求。随着 Spring Boot 3 的推出,这一机制变得更加强大和灵活,使得 Spring Boot 继续保持其作为现代 Java 开发的首选框架的地位。

相关文章:

重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类 工作原理关键组件以TomcatServletWebServerFactory为例ServletWebServerFactory会创建webServer的时机关键…...

FileZillaClient连接被拒绝,无法连接

1.ECONNREFUSED - 连接被服务器拒绝 2、无法连接FZ时&#xff0c;判断没有ssh 更新源列表&#xff1a; sudo apt-get update 安装 openssh-server &#xff1a;sudo apt-get install openssh-server 查看是否启动ssh&#xff1a;sudo ps -e | grep ssh...

每日一面——成员初始化列表、移动构造和拷贝构造

写前声明&#xff1a;参考链接 C面经、面试宝典 等 ✊✊✊每日一面——成员初始化列表、移动构造和拷贝构造 一、类成员初始化方式&#xff1f;构造函数的执行顺序&#xff1f;为什么用成员初始化列表会快一些&#xff1f;二、final和override关键字三、拷贝初始化和直接初始化…...

OPC UA 服务器的Web访问

基于Web 的应用非常普及&#xff0c;例如基于web 的SCADA &#xff0c;物联网 Dashboard 等等&#xff0c;那么基于Web 的应用如何访问OPC UA 服务器呢&#xff1f;本博文讨论这方面的问题。 Web 的通信方式 Web 是我们通常讲的网站&#xff0c;它由浏览器&#xff0c;HTTP 服…...

docker 子网

当需要给容器分配指定 ip &#xff0c;为避免ip 冲突&#xff0c;指定容器子网处理 创建 subnet 子网 docker network create --subnet 10.0.0.0/24 --gateway 10.0.0.1 subnet-testdocker network ls NETWORK ID NAME DRIVER SCOPE ... f582ecf297bc sub…...

QT使用RabbitMQ

文章目录 1.RabbitMQ 客户端下载地址:1.1RabbitMQ基本结构:2.搭建RabbitMQ server3.安装步骤4.运行4.1 报错问题解决5.使用5.1 配置Web管理界面6.常用命令总结7.Qt客户端编译7.1 这里重点强调一下,这个文件需要改成静态库7.2 下载地址:(qamqp自己下载,下载成功后,静态编译…...

什么是R语言?什么是R包?-R语言001

R语言是一种专为统计计算和图形而设计的编程语言和环境。它最初由罗斯伊哈卡和罗伯特亨特尔在1993年创建&#xff0c;灵感来源于S语言。R语言已经发展成为统计学、数据分析、科学研究以及许多其他领域中最受欢迎和广泛使用的工具之一。R语言的核心是一个开源的解释型语言&#…...

Java17 --- springCloud之LoadBalancer

目录 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom 1.3、80服务controller层&#xff1a; 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom <!--loadbalancer-->&…...

Mac(含M1) 使用 brew 安装nvm

目录 Mac 安装nvm 下载命令 配置环境变量 刷新 Mac(M1) 安装nvm 搜索 下载 为nvm创建文件夹 配置环境变量 刷新 Mac 安装nvm 下载命令 brew install nvm 配置环境变量 vi ~/.zshrc 内容如下&#xff1a; export NVM_DIR"$HOME/.nvm"[ -s "/usr/local…...

优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端零基础教学&#xff0c;实战进阶 景天的主页&#xff1a;景天科技苑 文章目录 Vuevue.js库的基本使用vue.js的M-V-VM思…...

<2024最新>ChatGPT逆向教程

前言 在使用本篇文章用到的项目以及工具时,需要对其有一定的了解,无法访问以及无法使用的问题作者不承担任何责任,可以自行想办法解决遇到的问题​。 文章若有不合适,有问题的地方,请私聊指出,谢谢~ 准备工具 一台至少 2 核 2G 内存的服务器,推荐是位于香港、新加坡或…...

C#编程技巧--2

1.使用泛型: 泛型允许你编写更加灵活和可重用的代码&#xff0c;同时提高类型安全性。 C# 中的泛型功能允许你编写更加灵活和可重用的代码&#xff0c;并且可以增加类型安全性。通过使用泛型&#xff0c;你可以编写适用于不同类型的代码&#xff0c;而无需为每种类型单独重写代…...

设计模式 代理模式

代理模式主要使用了 Java 的多态&#xff0c;主要是接口 干活的是被代理类&#xff0c;代理类主要是接活&#xff0c; 你让我干活&#xff0c;好&#xff0c;我交给幕后的类去干&#xff0c;你满意就成&#xff0c;那怎么知道被代理类能不能干呢&#xff1f; 同根就成&#xff…...

关于学习时间

这篇文章我来说一下我对于我最近学习时间的一些思考。 早上和下午是我最为活跃和高效的时间段。 我能够专注地工作&#xff0c;不容易分心。 然而&#xff0c;到了晚上&#xff0c;我的状态开始下降&#xff0c;这是很正常的情况。 由于早上和下午的专注学习&#xff0c;我的大…...

Github:Your browser did something unexpected. Please try again.

问题概述 Github&#xff1a;Your browser did something unexpected. Please try again. If the error continues, try disabling all browser extensions. 问题原因&#xff1a; 提示是插件出了问题&#xff0c;关闭了所有插件也无法解决&#xff0c;搜索了一下说是VPN的问题…...

Django性能优化

1.服务器CPU太高的优化 在Django项目中使用line_profiler进行性能剖析&#xff0c;您需要遵循以下步骤来设置并使用它&#xff1a; 1. **安装line_profiler**&#xff1a; 在命令行中执行以下命令来安装line_profiler&#xff1a; pip install line_profiler …...

全网最详细Docker命令(分类总结)

默认存储容器地址 cd /var/lib/docker 容器生命周期 Docker 命令 开启docker &#xff1a; systemctl start docker 查看docker状态 &#xff1a;systemctl status docker 停止&#xff1a;systemctl stop docker 重启: systemctl restart docker docker开机自启&#xf…...

运维自动化之ANSIBLE

一、Ansible的发展史及功能 官网&#xff1a;https://www.ansible.com/ 官方文档&#xff1a;https://docs.ansible.com/ 1、Ansible功能 2、Ansible特性 批量执行远程命令,可以对远程的多台主机同时进行命令的执行 批量安装和配置软件服务&#xff0c;可以对远程的多台主机…...

算法训练day42leetcode01背包问题 416. 分割等和子集

01 背包 题目描述 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 题目分析 每一件物品其实只有两个状态&#xff0c;取或者不取&…...

VulnHub - DarkHole

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog DarkHole 靶机下载地址&#xff1a;DarkHole: 1 ~ VulnHub 0x01 信息收集 Nmap扫描目标主机&#xf…...

揭秘openGauss向量化执行引擎代价模型

揭秘openGauss向量化执行引擎代价模型openGauss的向量化执行引擎针对列存&#xff0c;生成执行计划后根据配置项是否开启直接决定是否将执行计划转换成向量化执行计划来执行。若向量化执行引擎在行存上执行就需要将数据转换成VectorBatch即列存的形式才可执行&#xff0c;这个转…...

Gephi新手必看:如何用Excel表格快速创建你的第一个社交网络图

Gephi新手必看&#xff1a;如何用Excel表格快速创建你的第一个社交网络图 第一次打开Gephi时&#xff0c;那些复杂的界面和术语可能会让你望而却步。但别担心&#xff0c;就像用Excel做表格一样简单&#xff0c;我们完全可以用最熟悉的电子表格来构建专业的社交网络图。想象一下…...

ArdTap:Arduino零代码现场调试框架

1. ArdTap&#xff1a;面向嵌入式现场调试的零代码移动配置框架1.1 工程定位与设计哲学ArdTap 是一个专为 Arduino 生态设计的轻量级远程管理库&#xff0c;其核心目标并非替代传统固件开发流程&#xff0c;而是解决嵌入式系统在部署后阶段的现场参数调优、运行状态监控与快速功…...

OpenClaw自动化周报:Qwen2.5-VL-7B整合代码提交与JIRA生成图文报告

OpenClaw自动化周报&#xff1a;Qwen2.5-VL-7B整合代码提交与JIRA生成图文报告 1. 为什么需要自动化周报 每周五下午&#xff0c;我都会陷入一种"周报焦虑"——要手动整理Git提交记录、JIRA任务状态、代码评审意见&#xff0c;再用Excel做数据透视&#xff0c;最后…...

2026最权威的十大AI辅助写作平台横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于深度学习模型的论文一键生成技术&#xff0c;可快速整合文献资料&#xff0c;能提取核心…...

MATLAB语音识别 matlab语音识别,可以识别数字0-9,有gui界面,注释齐全,有报告

MATLAB语音识别 matlab语音识别&#xff0c;可以识别数字0-9&#xff0c;有gui界面&#xff0c;注释齐全&#xff0c;有报告。&#xff08;本程序测试版本为Matlab 2019b&#xff0c;低于此版本的请安装新版&#xff0c;以免无法运行&#xff09; 链接为电子资料&#xff0c;一…...

【数据结构与算法】第29篇:红黑树原理与C语言模拟

一、红黑树的定义1.1 五大性质红黑树是一种自平衡二叉查找树&#xff0c;每个节点增加一个颜色属性&#xff08;红或黑&#xff09;&#xff0c;必须满足&#xff1a;性质说明性质1每个节点是红色或黑色性质2根节点是黑色性质3所有叶子节点&#xff08;NIL&#xff09;是黑色性…...

SPSS老版本用户必看:如何用R3.2.5实现高级统计分析(附完整语法示例)

SPSS老版本用户必看&#xff1a;如何用R3.2.5实现高级统计分析&#xff08;附完整语法示例&#xff09; 对于长期使用SPSS老版本的研究者来说&#xff0c;面对日益复杂的数据分析需求时&#xff0c;常常会遇到软件功能受限的困境。特别是在临床医学和社会科学研究中&#xff0c…...

综合强度信息的激光雷达去拖尾算法解析和源码实现

1. 内容本文主要介绍基于几何特征与信号强度的去拖尾算法&#xff0c;和程序实现。2. 激光雷达的常见误差类型2.1 拖尾&#xff08;Trailing&#xff09;拖尾是指当激光束照射到高反射率物体&#xff08;如反光条、玻璃、镜子、路面标志等&#xff09;时&#xff0c;在真实目标…...

革命性模糊测试平台ClusterFuzz:Google如何用10万+虚拟机发现27,000个安全漏洞

革命性模糊测试平台ClusterFuzz&#xff1a;Google如何用10万虚拟机发现27,000个安全漏洞 【免费下载链接】clusterfuzz Scalable fuzzing infrastructure. 项目地址: https://gitcode.com/gh_mirrors/clu/clusterfuzz 在软件安全领域&#xff0c;模糊测试已成为发现漏洞…...