广告
返回顶部
首页 > 资讯 > 服务器 >使用SpringBoot内置web服务器
  • 696
分享到

使用SpringBoot内置web服务器

2024-04-02 19:04:59 696人浏览 八月长安
摘要

目录一、SpringBoot默认WEB服务器?二、如何配置当前web容器?三、内嵌Web服务器如何切换(从Tomcat到jetty)?四、Web容器怎么自动配置?五、web容器启动源

本文介绍SpringBoot内置web服务器。知识点有SpringBoot默认web服务器;如何配置当前web容器;内嵌Web服务器如何切换(从tomcat到jetty);Web容器怎么自动配置;web容器启动源码解析;SpringBoot内置服务器不使用SPI机制特别说明。

一、SpringBoot默认web服务器?

在SpringBoot中采用的默认web服务器是Tomcat,要了解为什么是Tomcat可从源码入手。

对于web服务器的配置,也是在自动配置中找,前面学习了SpringBoot自动配置Webmvc的知识,可以推测对于Web服务器的配置应该也是在一个自动配置类当中进行的,那么可以去/META-INF/spring.factories文件找一下WebMVC的自动配置,在这个自动配置内可以间接找到关于Web服务器的配置。


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

在上面SpringBoot包的目录找到这个路径下的Web服务器自动配置类。

这个Web服务器的自动配置类,我们可以看到这个配置类支持3种web服务器(Tomcat,Jetty,Undertow),具体要配置哪种服务器由ServletWebServerFactoryConfiguration来决定,同时这里还定义了一个顺序,依次是Tomcat->Jetty->Undertow。

那要选择哪种服务器呢?看ServletWebServerFactoryConfiguration。

在这个web服务器工厂配置类中,分别对上述三种服务器进行了定义:

对Tomcat定义:判断环境中是否引入了Tomcat所需的依赖Servlet.class, Tomcat.class, UpgradeProtocol.class,同时用户没有自己进行Web服务器配置(比如自己通过实现ServletWebServerFactory接口进行手动配置web服务器),那么这个Tomcat服务器就会生效。

对Jetty定义:所需要的依赖有Servlet.class, Server.class, Loader.class, WebAppContext.class

对Undertow定义:所需要的依赖有Servlet.class, Undertow.class, SslClientAuthMode.class

那么问题来了,SpringBoot如果这几种都有,那是怎么选择呢?从ServletWebServerFactoryAutoConfiguration配置类


@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsReGIStrar.class,
      ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
      ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
      ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration 

通过@Import就可以看出这里定义了一个顺序,依次是Tomcat->Jetty->Undertow,意思就是当环境中有Tomcat满足的依赖时就会优先使用Tomcat,依次往后推。

而一般情况下,在SpringBoot依赖中默认就已经引入tomcat的依赖,因此这里对于tomcat来说一般情况下会恒成立,那么Tomcat就会一直作为恒成立条件被SpringBoot首选为默认服务器。

二、如何配置当前web容器?

想要配置当前Web容器,可以通过yml配置让SpringBoot自动加载解析修改配置,也可以通过提供自定义的@Bean方法忽略SpringBoot自动配置采用手动配置方式。

为什么是通过@Bean提供ServletWebServerFactory和WebServerFactoryCustomizer的Bean交给Spring就可以跳过SpringBoot的自动web服务器配置呢?可从源码分析如下:

对于WebServerFactoryCustomizer在上面ServletWebServerFactoryConfiguration配置类Factory配置Tomcat,Jetty时在注解上会判断存过存在自己手动添加的ServletWebServerFactory则不再进行自动配置:

对于WebServerFactoryCustomizer则在ServletWebServerFactoryAutoConfiguration服务器自动配置类加载时,如果存在自己定义的WebServerFactoryCustomizer,那么就会触发一个WebServerFactoryCustomizerBeanPostProcessor后置处理器,在这个后置处理器中会遍历这些WebServerFactoryCustomizer并且执行内部customize方法,从而跳过自动配置,转为进行自定义配置:

三、内嵌Web服务器如何切换(从tomcat到jetty)?

上面通过源码可以知道一般情况下,Tomcat会一直作为恒成立条件被SpringBoot首选为默认服务器。

但是我们如果不想用Tomcat作为默认服务器,例如想切换为Jetty,那么我们应该怎么办呢?

我们可以把Tomcat的相关依赖在pom.xml中的spring-boot-starter-web中剔除掉,使环境不再拥有Tomcat依赖,同时加入Jetty的依赖那么就能使Jetty作为满足条件被SpringBoot选择了。


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 剔除Tomcat -->
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>
 
<!-- 加入jetty -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

这样,SpringBoot重新启动后就会切换为Jetty服务器了。

四、Web容器怎么自动配置?

对于Web容器的自动配置,以Tomcat未来可以看上面提到的TomcatServletWebServerFactory,这是通过@Bean自动注入一个Tomcat的工厂类:

这个工厂类内部会对Tomcat进行一些初始化操作,最重要的操作在getWebServer方法内:

首先这个类是SpringBoot包提供的,用的是最底层的tomcat实例进行配置(通过new Tomcat的方式,而这个Tomcat是tomcat源码包的一个实例类 package org.apache.catalina.startup),具体的配置细节不做描述,主要对端口,协议,tomcat组件对象等进行初始化并封装:

将要发布的Web应用信息Context初始化到tomcat中:

对初始化好的tomcat进行封装并启动:

最后将这个tomcat对象封装为一个TomcatWebServer对象供SpringBoot启动时调用。

综上,web容器的自动配置,实际上是SpringBoot通过创建原生Tomcat对象,对这个对象进行端口,协议,组件等初始化,并且将Web应用信息Context对象封装到这个tomcat对象中,然后Web应用信息配置生命周期监听生效后启动tomcat,最后将这个过程

封装到一个WebServer对象中供SpringBoot启动时调用。

五、web容器启动源码解析?

SpringBoot是什么时候运行了一个web服务器呢?这个要从SpringBootApplication.run()方法进行分析。以tomcat为例按照上面提到的,这个启动过程应该会调用到TomcatServletWebServerFactory.getWebServer方法获取这么一个tomcat实例。

调用链可看下面图示:

SpringBootApplication.run():

context = createApplicationContext():创建Context环境,这个方法内会根据当前环境初始化不同的Context,如果是Web环境则会初始化出AnnotationConfigServletWebApplicationContext:

初始化AnnotationConfigServletWebApplicationContext之后,在构造函数调用这个context的refresh方法-->onRefresh方法:

调用onRefresh方法,就会调用到ServletWebServerApplicationContext的onRefresh方法,在这个方法内,就对web服务器进行了创建操作createWebServer():

在createWebServer()方法中,会判断是外置还是内置方式发布应用,分别进行不同的逻辑操作。我们这里以内置来学习:

这样,SpringBoot启动时在创建Web服务器时,就执行到了getWebServer的操作,然后再对Web服务器进行创建,初始化和启动操作。

综上:在SpringBoot的run启动时,会判断当前所处环境。

如果是Web环境则通过创建一个ServletWebServerApplicationContext,执行构造函数的refresh方法,在refresh方法内重写onRefresh方法,执行创建createWebServer()方法,这个方法会根据当前应用是内置还是外置发布方式来决定以何种方式获取web服务器。

如果是内置方式则通过TomcatServletWebServerFactory工厂类来获取一个首选的web服务器,然后进行服务器的初始化配置,应用加载生效以及服务器启动的操作。

六、SpringBoot内置服务器不使用SPI机制特别说明?

最后还有一个结论要记住:对于SpringBoot内置服务器不会通过SPI的机制(官网也有特别说明),因为SpringBoot内置服务器是SpringBoot自己帮我们创建了web服务器来发布应用,不使用SPI机制的目的就是尽可能减少内置和外置web服务器可能存在的冲突,让web应用由SpringBoot自己来管理。详细原因和原理这里不做研究。

至此,关于SpringBoot内置服务器的相关知识解析就到此了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 使用SpringBoot内置web服务器

本文链接: https://www.lsjlt.com/news/136758.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用SpringBoot内置web服务器
    目录一、SpringBoot默认web服务器?二、如何配置当前web容器?三、内嵌Web服务器如何切换(从tomcat到jetty)?四、Web容器怎么自动配置?五、web容器启动源...
    99+
    2022-11-12
  • PHP 内置WEB服务器的简单使用
    目录直接启动一个内置服务器指定内置服务器的运行目录使用路由脚本在很多时候,我们需要简单的运行一个小 demo 来验证一些代码或者轮子是否可用,是否可以运行起来,但是去配 nginx ...
    99+
    2022-11-12
  • PHP5.4内置Web服务器的用法介绍
    本篇内容主要讲解“PHP5.4内置Web服务器的用法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP5.4内置Web服务器的用法介绍”吧!PHP是一种脚本语言,它需要PHP解释器来分析运...
    99+
    2023-06-17
  • 云服务器转发内网web服务怎么设置
    如果您想使用云服务器转发内网Web服务,以下是一些基本的设置步骤: 确定你的云服务器:首先,确认你的云服务器能够访问互联网。 创建Web服务:在云服务器的控制台(例如AWS、阿里云或微软的Web服务器软件)上创建Web服务,并将其指定为...
    99+
    2023-10-27
    内网 服务器 web
  • 云服务器转发内网web服务的设置方法
    1. 确保云服务器和内网服务器的网络连接 在设置云服务器转发内网web服务之前,首先要确保云服务器和内网服务器之间建立了网络连接。可以通过以下几种方式实现网络连接: 使用虚拟专用网络(VPC):在云服务提供商的控制台中创建一个VPC,并...
    99+
    2023-10-28
    内网 服务器 方法
  • SpringBoot 内置工具类的使用
    目录断言对象、数组、集合 ObjectUtilsStringUtilsCollectionUtils文件、资源、IO 流 FileCopyUtilsResourceUtilsStre...
    99+
    2022-11-12
  • 云服务器转发内网web服务怎么设置密码
    对于云服务器的web服务,用户需要使用一些身份验证方法来确保其账户的安全性。以下是在云服务器上提供web服务时需要提供的密码。 SSL加密:使用SSL加密是在云服务器上提供web服务的必要条件。SSL证书可以帮助服务器端验证用户身份,从...
    99+
    2023-10-28
    内网 密码 服务器
  • 云服务器转发内网web服务
    云服务器转发内网web服务通常用于将Web应用程序或服务从本地计算机传输到云服务器。这些服务通常由云服务器提供并由其客户端执行,可以通过如Internet Explorer、Microsoft Azure等浏览器访问。 以下是一些可能用于...
    99+
    2023-10-26
    内网 服务器 web
  • 怎么用Nginx配置web服务器
    这篇“怎么用Nginx配置web服务器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用...
    99+
    2022-10-19
  • 使用阿里云服务器配置Web服务器的详细步骤
    随着互联网的发展,越来越多的企业和个人开始利用Web服务器来搭建自己的网站。而阿里云服务器作为一个稳定、高效的云平台,深受广大用户的喜爱。但是,对于一些新手用户来说,如何使用阿里云服务器配置Web服务器可能会感到有些困难。本文将会详细说明如...
    99+
    2023-12-18
    阿里 服务器配置 步骤
  • 云服务器如何配置web服务器
    云服务器可以配置为Web服务器的虚拟版本,用于支持Web应用程序。以下是一些云服务器配置Web服务器需要考虑的步骤: 选择云服务提供商:根据云服务提供商的网站或者联系他们的客户代表。 选择虚拟主机:选择可以为Web服务器虚拟版本提供支持...
    99+
    2023-10-26
    服务器 web
  • 如何配置web服务器
    配置web服务器的方法:需要安装IIS服务,在控制面板中添加Windows组件里找到应用程序服务器,打开选择Internet信息服务(IIS)和万维网服务进行安装。完成后,打开“Internet 信息服务管理器”创建Web网站,完成了新网站...
    99+
    2022-10-24
  • Springboot 内部服务调用方式
    目录Eureka注册的服务之间互相调用1.请求方2.接收方多模块化,服务间调用的坑问题背景解决办法Eureka注册的服务之间互相调用 1.请求方 启动类添加注解,扫描Eureka 中...
    99+
    2022-11-13
  • 云服务器转发内网web服务命令
    使用云服务器转发内网web服务的基本步骤如下: 配置云服务器:在使用云服务器之前,首先需要配置云服务器的IP地址和端口。您可以通过云服务器的控制面板进行配置,或者通过在线API进行配置。 发送内网web服务请求:接收到服务器的响应后,您...
    99+
    2023-10-28
    内网 命令 服务器
  • Ubuntu 16.04中怎么配置和使用NGINX Web服务器
    今天小编给大家分享一下Ubuntu 16.04中怎么配置和使用NGINX Web服务器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-27
  • Springboot内置的工具类CollectionUtils如何使用
    本篇内容主要讲解“Springboot内置的工具类CollectionUtils如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Springboot内置的工具类CollectionUtil...
    99+
    2023-07-06
  • Springboot内置的工具类CollectionUtils怎么使用
    这篇“Springboot内置的工具类CollectionUtils怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“S...
    99+
    2023-07-04
  • SpringBoot嵌入式Web容器如何使用
    这篇“SpringBoot嵌入式Web容器如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot嵌入式W...
    99+
    2023-07-04
  • Linux之Web服务器配置(Apache)
    摘要: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相...
    99+
    2023-09-26
    服务器 运维 linux apache
  • Nginx如何配置Web服务器
    这篇文章主要介绍“Nginx如何配置Web服务器”,在日常操作中,相信很多人在Nginx如何配置Web服务器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Nginx如何配置W...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作