SpringBoot嵌入式容器(自动配置原理、自定义嵌入式容器)

目录

  • 1. 自动配置原理
  • 2. 自定义嵌入式容器
  • 3. 最佳实践

Servlet容器:管理、运行Servlet组件(Servlet、Filter、Listener)的环境,一般指服务器

1. 自动配置原理

  • SpringBoot默认嵌入Tomcat作为Servlet容器
  • 自动配置类是ServletWebServerFactoryAutoConfiguration、EmbeddedWebServerFactoryCustomizerAutoConfiguration
  • 从自动配置类开始分析功能。如xxxxAutoConfiguration

先分析ServletWebServerFactoryAutoConfiguration自动配置类:

......省略部分......
@AutoConfiguration(after = {SslAutoConfiguration.class}
)
@AutoConfigureOrder(Integer.MIN_VALUE)
@ConditionalOnClass({ServletRequest.class})  
@ConditionalOnWebApplication(type = Type.SERVLET
)
@EnableConfigurationProperties({ServerProperties.class})
@Import({BeanPostProcessorsRegistrar.class, ServletWebServerFactoryConfiguration.EmbeddedTomcat.class, ServletWebServerFactoryConfiguration.EmbeddedJetty.class, ServletWebServerFactoryConfiguration.EmbeddedUndertow.class})
public class ServletWebServerFactoryAutoConfiguration {
......省略部分......
}
  1. ServletWebServerFactoryAutoConfiguration自动配置了嵌入式容器场景
  2. 绑定了ServerProperties配置类,所有和服务器有关的配置都是server开头,和tomcat有关的配置都是server.tomcat开头
  3. ServletWebServerFactoryAutoConfiguration导入了嵌入式的三大服务器 Tomcat、Jetty、Undertow
    1.导入Tomcat、Jetty、Undertow都有条件注解。系统中有这个类才行,也就是导了这个包
    2.默认 Tomcat配置生效。给容器中放了TomcatServletWebServerFactory,这是一个 web服务器工厂,造web服务器的
......省略部分......@Configuration(proxyBeanMethods = false)@ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class})@ConditionalOnMissingBean(value = {ServletWebServerFactory.class},search = SearchStrategy.CURRENT)static class EmbeddedTomcat {EmbeddedTomcat() {}@BeanTomcatServletWebServerFactory tomcatServletWebServerFactory(ObjectProvider<TomcatConnectorCustomizer> connectorCustomizers, ObjectProvider<TomcatContextCustomizer> contextCustomizers, ObjectProvider<TomcatProtocolHandlerCustomizer<?>> protocolHandlerCustomizers) {......省略部分......}......省略部分......}
......省略部分......

3.web服务器工厂 都有一个功能,getWebServer获取web服务器
4.TomcatServletWebServerFactory创建了tomcat

......省略部分......
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory implements ConfigurableTomcatWebServerFactory, ResourceLoaderAware {......省略部分......public WebServer getWebServer(ServletContextInitializer... initializers) {......省略部分......Tomcat tomcat = new Tomcat();......省略部分......}
......省略部分......
}
  1. ServletWebServerApplicationContextioc容器,启动的时候createWebServer方法会调用TomcatServletWebServerFactory.getWebServer创建web服务器
  2. Spring容器刷新(启动)的时候,执行经典的十二大步,会预留一个时机,调用onRefresh()刷新子容器
......省略部分......
public class ServletWebServerApplicationContext extends GenericWebApplicationContextimplements ConfigurableWebServerApplicationContext {......省略部分......@Overrideprotected void onRefresh() {super.onRefresh();try {createWebServer();}catch (Throwable ex) {throw new ApplicationContextException("Unable to start web server", ex);}}......省略部分......
}
  1. 经典的十二大步调用
......省略部分......
public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {......省略部分......@Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {......省略部分......try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);beanPostProcess.end();// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}......省略部分......}......省略部分......
}

总结:Web场景的Spring容器启动,在onRefresh的时候,会调用创建web服务器的方法。Web服务器的创建是通过WebServerFactory搞定的。容器中又会根据导人员的包进行条件注解,启动相关的服务器配置,默认EmbeddedTomcat会给容器中放一个TomcatServletWebServerFactory,进行项目启动,自动创建出Tomcat

2. 自定义嵌入式容器

切换嵌入式服务器。如下所示:

    <properties><!-- springboot3使用jakarta-servlet 6,但是jetty使用jakarta-servlet 5- --><jakarta-servlet.version>5.0.0</jakarta-servlet.version></properties><dependencies><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></dependencies>

3. 最佳实践

用法:

  • 修改server下的相关配置就可以修改服务器参数
  • 通过给容器中放一个ServletWebServerFactory,来禁用掉SpringBoot默认放的服务器工厂,实现自定义嵌入任意服务器

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

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

相关文章

抽象类与接口

抽象类&#xff1a; 父类某些方法需要声明&#xff0c;但又不确定如何实现&#xff0c;可将其声明抽象方法&#xff0c; 【抽象类主要是为了防止创建父类对象】 抽象类与抽象方法 抽象方法没有方法体 类中有抽象方法&#xff0c;类必须声明为抽象类 …

java开发之个微机器人的实现

简要描述&#xff1a; 二次登录 请求URL&#xff1a; http://域名地址/secondLogin 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wcId…

k8s之Pod常用命令详解、镜像拉取策略(imagePullPolicy)

常用命令 kubectl get pod #查看默认命名空间下所有pod kubectl describe pod podname #获取默认命名空间下POD详情# 如果要查看制定命名空间则使用 -n nsname kubectl get pod -n ns kubectl describe pod podname -n ns# 以YAML格式提供比 kubectl describe pod 更加详细的信…

【每日一题】从二叉搜索树到更大和树

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;中序遍历的反序方法二&#xff1a;后缀数组 写在最后 Tag 【中序遍历】【二叉树】【2023-12-04】 题目来源 1038. 从二叉搜索树到更大和树 题目解读 在二叉搜索树中&#xff0c;将每一个节点的值替换成树中大于等于该…

DDR详解

DDR也就是常称的内存在一般使用过程中都是透明的&#xff0c;此文从多方面对DDR进行详解。 DDR训练 高可靠性是系统级芯片SoC重要的质量和性能要求之一。SoC的复杂在于各个IP模块都对其产生至关重要的影响。从芯耀辉长期服务客户的经验来看&#xff0c;在客户的SoC设计中&…

根文件系统lib库添加与初步测试

一. 简介 我们在编译 busybox源码时&#xff0c;选择的是动态编译&#xff0c;所以&#xff0c;制作生成的 根文件系统中/bin或 /sbin目录下软件运行时会调用到一些库文件的。库文件就是交叉编译器的库文件。 前面我们编译 busybox源码时&#xff0c;选择动态编译&#xff0…

NPS内网穿透教程

1.简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发&#xff0c;可支持任何tcp、udp上层协议&#xff08;访问内网网站、本地支付接口调试、ssh访问、远程桌面&#xff0c;内网dns解析等等……&#xff09;&#xff0c;此外还支持内网ht…

【python爬虫】设计自己的爬虫 2. 数据保存封装 mongodb,mysql和elasticsearch

mongodb, mysql和elasticsearch 功能较相似&#xff0c;所以打算用一套接口将它们封装起来 基类StorageBase 如下&#xff1a; class StorageBase:def __init__(self, hostNone, portNone, databaseNone, tableNone, locationNone, accountNone, passwordNone,urlNone):self…

安卓1.0明显是基于linux内核开发的,安卓1.0是不是linux套壳?

安卓1.0明显是基于linux内核开发的&#xff0c;安卓1.0是不是linux套壳&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「安卓开发资料从专业入门到高级教程工具包」&#xff0c;点个关注&…

141. 环形链表

141. 环形链表 设置一个fast指针&#xff0c;一个slow指针&#xff0c;fast一次走两步&#xff0c;slow一次走一步。如果fast和slow相遇&#xff0c;则说明有环。反之没相遇则无环。 注意快慢指针的while循环条件是fast.next ! null && fast.next.next ! null /*** …

大数据集群增加数据盘,平衡数据盘HDFS Disk Balancer

大数据集群增加数据盘&#xff0c;平衡数据盘HDFS Disk Balancer 官网&#xff1a;https://hadoop.apache.org/docs/r3.3.6/hadoop-project-dist/hadoop-hdfs/HDFSDiskbalancer.html hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.jsonhdfs diskbalancer -q…

StringJoiner使用详解

关于StringJoiner 1.介绍2.源码2.1 属性2.2 方法 3 举例StringJoiner做法3.1 只含间隔符3.2 含间隔符和前后缀3.3 merge合并两个joiner3.4 stringJoiner.setEmptyValue("xxx");3.5 综合举例length()方法 1.介绍 在JDK1.8之后&#xff0c;提供了一个StringJoiner类用来…

简谈oracle数据库的归档模式

一、oracle数据库归档模式简介 Oracle数据库归档模式是一种数据备份和恢复策略,它允许数据库记录所有数据库的更改操作(包括已提交和未提交的事务)并将其存储在归档日志中。这些归档日志可以用于在数据库发生故障时进行恢复,并提供点时间恢复(PITR)的能力。 在Oracle数…

ruoyi-vue 整合netty实现TCP/IP协议数据接收

支持持续接收数、可发送数据、可多端口连接。 废话少说&#xff0c;直接上代码&#xff01; 如果写的可以&#xff0c;记得点个赞~ import com.alibaba.fastjson.JSON; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; imp…

PHP 刷新缓存区的问题!

PHP流式输出&#xff0c;在Nginx下可以正常刷新缓存区 &#xff0c; 但是在Apache下会等待循环全部执行完&#xff0c;才会刷新&#xff01;有怎么解决&#xff1f; header(X-Accel-Buffering: no); // Nginx情况下必须加这一行header(Content-type: text/event-stream);header…

【刷题】【力扣牛客】反转链表的五种方式——Java

文章目录 前言方法一&#xff1a;构造新链表&#xff08;构造新节点&#xff09;方法二&#xff1a;构造新链表&#xff08;不构造新节点&#xff09;方法三&#xff1a;递归方法四&#xff1a;双指针方法五&#xff1a;遍历总结 力扣题目链接&#xff1a;206. 反转链表 牛客题…

IDEA2023找不到 Allow parallel run

我的idea版本&#xff1a;2023.1.4 第一步&#xff1a;点击Edit Configrations 第二步&#xff1a;点击Modify options 第三步&#xff1a;勾选Allow multiple instances 最后点击Apply应用一下 ok,问题解决&#xff01;

SSM项目实战-登录验证成功并路由到首页面,Vue3+Vite+Axios+Element-Plus技术

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/sysUser.js import request from "../util/request.js";export const login (…

Mysql日志

文章目录 1. 日志类型2. bin log2.1 写入机制2.2 binlog与redolog对比2.3 两阶段提交 3. 中继日志 1. 日志类型 这 6 类日志分别为&#xff1a; 慢查询日志&#xff1a; 记录所有执行时间超过long_query_time的所有查询&#xff0c;方便我们对查询进行优化。 通用查询日志&am…

在sCrypt网站上铭刻Ordinals

sCrypt发布了一个新的Ordinals铭刻工具&#xff0c;连接Panda Wallet后即可使用。你可以观看我们录制的视频教程&#xff0c;获得更多细节。 铭刻工具同时支持BSV主网&#xff08;mainnet&#xff09;和测试网&#xff08;testnet&#xff09;&#xff0c;你可以在我们的官方网…