重学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 开发的首选框架的地位。

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

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

相关文章

25考研数据结构复习·3.2队列

队列&#xff08;Queue&#xff09;基本概念 定义 队列&#xff08;Queue&#xff09;时只允许在一端进行插入&#xff0c;在另一端删除的线性表。 特点&#xff1a;先进入队列的元素先出队 先进先出 First In First Out(FIFO) 重要术语 队头、队尾、空队列 基本操作 创、销 I…

页面配置、网络数据请求

1. 页面配置文件的作用 小程序中&#xff0c;每个页面都有自己的 .json 配置文件&#xff0c;用来对当前页面的窗口外观、页面效果等进行配置。 2. 页面配置和全局配置的关系 小程序中&#xff0c; app.json 中的 window 节点&#xff0c;可以全局配置小程序中每个页面的窗口…

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…

Java初阶数据结构二叉树实现+练习完整(工程文件后序会进行上传)

i1.二叉树的概念 1.二叉树的定义 &#xff08;1&#xff09;二叉树可以是一个节点的有限集合 &#xff08;2&#xff09;可以为空 &#xff08;3&#xff09;或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成的 &#xff08;4&#xff09;二叉树的每一个节点…

python爬虫实战——抖音

目录 1、分析主页作品列表标签结构 2、进入作品页前 判断作品是视频作品还是图文作品 3、进入视频作品页面&#xff0c;获取视频 4、进入图文作品页面&#xff0c;获取图片 5、完整参考代码 6、获取全部作品的一种方法 本文主要使用 selenium.webdriver&#xff08;Firef…

手机网络连接性能API接口:查询手机网络连接性能状态

手机在网状态查询服务是一项非常方便的服务&#xff0c;可以帮助我们随时了解一个手机号码的在网状态。不论是查询自己的手机号码&#xff0c;还是查询他人的手机号码&#xff0c;这个服务都可以帮助我们获取准确的信息。今天&#xff0c;我想和大家介绍一个非常好用的手机在网…

力扣100题—持续更新

目录 LC141环形列表(easy)题目描述方法1&#xff1a;快慢指针&#xff08;1&#xff09;思路&#xff08;2&#xff09;python代码&#xff08;3&#xff09;复杂度分析 LC881救生艇&#xff08;medium&#xff09;题目描述方法1&#xff1a;双指针-对撞指针&#xff08;1&…

柚见第十二期(随机匹配)

随机匹配 目的 为了帮大家更快地发现和自己兴趣相同的朋友 问题 匹配 1 个还是匹配多个&#xff1f; 答&#xff1a;匹配多个&#xff0c;并且按照匹配的相似度从高到低排序 怎么匹配&#xff1f;&#xff08;根据什么匹配&#xff09; 答&#xff1a;标签 tags 还可以根据 us…

分享一下自己总结的7万多字java面试笔记和一些面试视频,简历啥的,已大厂上岸

分享一下自己总结的7万多字java面试笔记和一些面试视频&#xff0c;简历啥的&#xff0c;已大厂上岸 自己总结的面试简历资料&#xff1a;https://pan.quark.cn/s/8b602fe53b58 文章目录 SSMspringspring 的优点&#xff1f;IoC和AOP的理解**Bean 的生命周期****列举一些重要…

一命通关差分

本章节是前缀和的延申 一命通关前缀和-CSDN博客https://blog.csdn.net/qq_74260823/article/details/136530291?spm1001.2014.3001.5501 一命通关前缀和 公交车 引入 还是利用我们在前缀和中所采用的例子——公交车。 有一辆公交车&#xff0c;一共上下了N批乘客&#xff1a…

【Vue3】源码解析-Runtime

文章目录 系列文章packages/runtime-dom/src/index.ts初始化创建renderermount \src\runtime-core\component.jsh.tspackages/runtime-core/src/renderer.ts挂载及卸载DOM节点render packages/runtime-dom/src/nodeOps.tspackages/runtime-core/src/apiCreateApp.ts创建appmoun…

全国农产品价格分析预测可视化系统设计与实现

全国农产品价格分析预测可视化系统设计与实现 【摘要】在当今信息化社会&#xff0c;数据的可视化已成为决策和分析的重要工具。尤其是在农业领域&#xff0c;了解和预测农产品价格趋势对于农民、政府和相关企业都至关重要。为了满足这一需求&#xff0c;设计并实现了全国农产…

RabbitMQ 面试题及答案整理,最新面试题

RabbitMQ的核心组件有哪些&#xff1f; RabbitMQ的核心组件包括&#xff1a; 1、生产者&#xff08;Producer&#xff09;&#xff1a; 生产者是发送消息到RabbitMQ的应用程序。 2、消费者&#xff08;Consumer&#xff09;&#xff1a; 消费者是接收RabbitMQ消息的应用程序…

哥斯拉流量webshell分析-->ASP/PHP

哥斯拉流量webshell分析 哥斯拉是继菜刀、蚁剑、冰蝎之后的又一个webshell利器&#xff0c;这里就不过多介绍了。 哥斯拉GitHub地址&#xff1a;https://github.com/BeichenDream/Godzilla 很多一线师傅不太了解其中的加解密手法&#xff0c;无法进行解密&#xff0c;这篇文章…

Web3社交项目UXLINK零撸教程

简介&#xff1a;UXLINK是Web3行业中首个主打双向、熟人社交关系的产品&#xff0c;与其他社交基础设施类项目相比&#xff0c;类似Twitter Vs Facebook、微博 Vs 微信的社交结构区别。UXLINK的愿景&#xff1a;1、社交中心&#xff1a;成为最大的社交平台&#xff0c;专注于真…

goctl-swagger 生成json接口文件

参考&#xff1a; GitHub - dyntrait/goctl-swagger: 通过 api 文件生成 swagger 文档 GitHub - Bluettipower/goctl-swagger 一:编译 执行go install 前一般需要设置环境&#xff0c;不然资源经常会下载不下载 go env -w GOPROXYhttps://goproxy.cn,direct 执行完 go in…

IO流(主要是记住四大类InputStream,OutputStream、Reader和Writer,其他都是他们的子类)

IO流 1、文件 &#xff08;1&#xff09;文件概念 文件就是保存数据的地方。例如word文档&#xff0c;txt文件&#xff0c;execl文件等等。 &#xff08;2&#xff09;文件流 文件在程序中是以流的形式来操作的。 流&#xff1a;数据在数据源&#xff08;文件&#xff09;…

【Python】Python中的正则表达式

Python中的正则表达式 1.re模块使用入门 1.1 re.match 函数 函数定义&#xff1a; re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match() 就返回 none。 函数语法&#xff1a; re.match(pattern, string, flags0) …

二叉树【Java】

二叉树遍历 前序遍历 中序遍历 后续遍历 代码 前 中 后序遍历 package Trww;public class TreeTraversal {/*12 34 5 6*/public static void main(String[] args) {TreeNode tree new TreeNode(new TreeNode(new TreeNode(4),2,null),1,new TreeNode(new TreeNode(5),3,n…

maven私服搭建详细教程

1、为什么需要私服 如果在公司中多个项目模块中的的公共类用的都是一样的&#xff0c;那么不可能将这些一样的代码写两遍。所以将其中一个项目中的代码打包成私服&#xff0c;然后在另外一个模块中去进行引用。 除此之外&#xff0c;如果大公司中开发人员较多&#xff0c;大家同…