欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用SpringBoot內(nèi)置web服務(wù)器

 更新時(shí)間:2021年09月26日 12:03:46   作者:喜歡火影的木易楊  
這篇文章主要介紹了使用SpringBoot內(nèi)置web服務(wù)器操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

本文介紹SpringBoot內(nèi)置web服務(wù)器。知識(shí)點(diǎn)有SpringBoot默認(rèn)web服務(wù)器;如何配置當(dāng)前web容器;內(nèi)嵌Web服務(wù)器如何切換(從tomcat到j(luò)etty);Web容器怎么自動(dòng)配置;web容器啟動(dòng)源碼解析;SpringBoot內(nèi)置服務(wù)器不使用SPI機(jī)制特別說明。

一、SpringBoot默認(rèn)web服務(wù)器?

在SpringBoot中采用的默認(rèn)web服務(wù)器是Tomcat,要了解為什么是Tomcat可從源碼入手。

對(duì)于web服務(wù)器的配置,也是在自動(dòng)配置中找,前面學(xué)習(xí)了SpringBoot自動(dòng)配置WebMVC的知識(shí),可以推測(cè)對(duì)于Web服務(wù)器的配置應(yīng)該也是在一個(gè)自動(dòng)配置類當(dāng)中進(jìn)行的,那么可以去/META-INF/spring.factories文件找一下WebMVC的自動(dòng)配置,在這個(gè)自動(dòng)配置內(nèi)可以間接找到關(guān)于Web服務(wù)器的配置。

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

在上面SpringBoot包的目錄找到這個(gè)路徑下的Web服務(wù)器自動(dòng)配置類。

這個(gè)Web服務(wù)器的自動(dòng)配置類,我們可以看到這個(gè)配置類支持3種web服務(wù)器(Tomcat,Jetty,Undertow),具體要配置哪種服務(wù)器由ServletWebServerFactoryConfiguration來決定,同時(shí)這里還定義了一個(gè)順序,依次是Tomcat->Jetty->Undertow。

那要選擇哪種服務(wù)器呢?看ServletWebServerFactoryConfiguration。

在這個(gè)web服務(wù)器工廠配置類中,分別對(duì)上述三種服務(wù)器進(jìn)行了定義:

對(duì)Tomcat定義:判斷環(huán)境中是否引入了Tomcat所需的依賴Servlet.class, Tomcat.class, UpgradeProtocol.class,同時(shí)用戶沒有自己進(jìn)行Web服務(wù)器配置(比如自己通過實(shí)現(xiàn)ServletWebServerFactory接口進(jìn)行手動(dòng)配置web服務(wù)器),那么這個(gè)Tomcat服務(wù)器就會(huì)生效。

對(duì)Jetty定義:所需要的依賴有Servlet.class, Server.class, Loader.class, WebAppContext.class

對(duì)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就可以看出這里定義了一個(gè)順序,依次是Tomcat->Jetty->Undertow,意思就是當(dāng)環(huán)境中有Tomcat滿足的依賴時(shí)就會(huì)優(yōu)先使用Tomcat,依次往后推。

而一般情況下,在SpringBoot依賴中默認(rèn)就已經(jīng)引入tomcat的依賴,因此這里對(duì)于tomcat來說一般情況下會(huì)恒成立,那么Tomcat就會(huì)一直作為恒成立條件被SpringBoot首選為默認(rèn)服務(wù)器。

二、如何配置當(dāng)前web容器?

想要配置當(dāng)前Web容器,可以通過yml配置讓SpringBoot自動(dòng)加載解析修改配置,也可以通過提供自定義的@Bean方法忽略SpringBoot自動(dòng)配置采用手動(dòng)配置方式。

為什么是通過@Bean提供ServletWebServerFactory和WebServerFactoryCustomizer的Bean交給Spring就可以跳過SpringBoot的自動(dòng)web服務(wù)器配置呢?可從源碼分析如下:

對(duì)于WebServerFactoryCustomizer在上面ServletWebServerFactoryConfiguration配置類Factory配置Tomcat,Jetty時(shí)在注解上會(huì)判斷存過存在自己手動(dòng)添加的ServletWebServerFactory則不再進(jìn)行自動(dòng)配置:

對(duì)于WebServerFactoryCustomizer則在ServletWebServerFactoryAutoConfiguration服務(wù)器自動(dòng)配置類加載時(shí),如果存在自己定義的WebServerFactoryCustomizer,那么就會(huì)觸發(fā)一個(gè)WebServerFactoryCustomizerBeanPostProcessor后置處理器,在這個(gè)后置處理器中會(huì)遍歷這些WebServerFactoryCustomizer并且執(zhí)行內(nèi)部customize方法,從而跳過自動(dòng)配置,轉(zhuǎn)為進(jìn)行自定義配置:

三、內(nèi)嵌Web服務(wù)器如何切換(從tomcat到j(luò)etty)?

上面通過源碼可以知道一般情況下,Tomcat會(huì)一直作為恒成立條件被SpringBoot首選為默認(rèn)服務(wù)器。

但是我們?nèi)绻幌胗肨omcat作為默認(rèn)服務(wù)器,例如想切換為Jetty,那么我們應(yīng)該怎么辦呢?

我們可以把Tomcat的相關(guān)依賴在pom.xml中的spring-boot-starter-web中剔除掉,使環(huán)境不再擁有Tomcat依賴,同時(shí)加入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重新啟動(dòng)后就會(huì)切換為Jetty服務(wù)器了。

四、Web容器怎么自動(dòng)配置?

對(duì)于Web容器的自動(dòng)配置,以Tomcat未來可以看上面提到的TomcatServletWebServerFactory,這是通過@Bean自動(dòng)注入一個(gè)Tomcat的工廠類:

這個(gè)工廠類內(nèi)部會(huì)對(duì)Tomcat進(jìn)行一些初始化操作,最重要的操作在getWebServer方法內(nèi):

首先這個(gè)類是SpringBoot包提供的,用的是最底層的tomcat實(shí)例進(jìn)行配置(通過new Tomcat的方式,而這個(gè)Tomcat是tomcat源碼包的一個(gè)實(shí)例類 package org.apache.catalina.startup),具體的配置細(xì)節(jié)不做描述,主要對(duì)端口,協(xié)議,tomcat組件對(duì)象等進(jìn)行初始化并封裝:

將要發(fā)布的Web應(yīng)用信息Context初始化到tomcat中:

對(duì)初始化好的tomcat進(jìn)行封裝并啟動(dòng):

最后將這個(gè)tomcat對(duì)象封裝為一個(gè)TomcatWebServer對(duì)象供SpringBoot啟動(dòng)時(shí)調(diào)用。

綜上,web容器的自動(dòng)配置,實(shí)際上是SpringBoot通過創(chuàng)建原生Tomcat對(duì)象,對(duì)這個(gè)對(duì)象進(jìn)行端口,協(xié)議,組件等初始化,并且將Web應(yīng)用信息Context對(duì)象封裝到這個(gè)tomcat對(duì)象中,然后Web應(yīng)用信息配置生命周期監(jiān)聽生效后啟動(dòng)tomcat,最后將這個(gè)過程

封裝到一個(gè)WebServer對(duì)象中供SpringBoot啟動(dòng)時(shí)調(diào)用。

五、web容器啟動(dòng)源碼解析?

SpringBoot是什么時(shí)候運(yùn)行了一個(gè)web服務(wù)器呢?這個(gè)要從SpringBootApplication.run()方法進(jìn)行分析。以tomcat為例按照上面提到的,這個(gè)啟動(dòng)過程應(yīng)該會(huì)調(diào)用到TomcatServletWebServerFactory.getWebServer方法獲取這么一個(gè)tomcat實(shí)例。

調(diào)用鏈可看下面圖示:

SpringBootApplication.run():

context = createApplicationContext():創(chuàng)建Context環(huán)境,這個(gè)方法內(nèi)會(huì)根據(jù)當(dāng)前環(huán)境初始化不同的Context,如果是Web環(huán)境則會(huì)初始化出AnnotationConfigServletWebApplicationContext:

初始化AnnotationConfigServletWebApplicationContext之后,在構(gòu)造函數(shù)調(diào)用這個(gè)context的refresh方法-->onRefresh方法:

調(diào)用onRefresh方法,就會(huì)調(diào)用到ServletWebServerApplicationContext的onRefresh方法,在這個(gè)方法內(nèi),就對(duì)web服務(wù)器進(jìn)行了創(chuàng)建操作createWebServer():

在createWebServer()方法中,會(huì)判斷是外置還是內(nèi)置方式發(fā)布應(yīng)用,分別進(jìn)行不同的邏輯操作。我們這里以內(nèi)置來學(xué)習(xí):

這樣,SpringBoot啟動(dòng)時(shí)在創(chuàng)建Web服務(wù)器時(shí),就執(zhí)行到了getWebServer的操作,然后再對(duì)Web服務(wù)器進(jìn)行創(chuàng)建,初始化和啟動(dòng)操作。

綜上:在SpringBoot的run啟動(dòng)時(shí),會(huì)判斷當(dāng)前所處環(huán)境。

如果是Web環(huán)境則通過創(chuàng)建一個(gè)ServletWebServerApplicationContext,執(zhí)行構(gòu)造函數(shù)的refresh方法,在refresh方法內(nèi)重寫onRefresh方法,執(zhí)行創(chuàng)建createWebServer()方法,這個(gè)方法會(huì)根據(jù)當(dāng)前應(yīng)用是內(nèi)置還是外置發(fā)布方式來決定以何種方式獲取web服務(wù)器。

如果是內(nèi)置方式則通過TomcatServletWebServerFactory工廠類來獲取一個(gè)首選的web服務(wù)器,然后進(jìn)行服務(wù)器的初始化配置,應(yīng)用加載生效以及服務(wù)器啟動(dòng)的操作。

六、SpringBoot內(nèi)置服務(wù)器不使用SPI機(jī)制特別說明?

最后還有一個(gè)結(jié)論要記住:對(duì)于SpringBoot內(nèi)置服務(wù)器不會(huì)通過SPI的機(jī)制(官網(wǎng)也有特別說明),因?yàn)镾pringBoot內(nèi)置服務(wù)器是SpringBoot自己幫我們創(chuàng)建了web服務(wù)器來發(fā)布應(yīng)用,不使用SPI機(jī)制的目的就是盡可能減少內(nèi)置和外置web服務(wù)器可能存在的沖突,讓web應(yīng)用由SpringBoot自己來管理。詳細(xì)原因和原理這里不做研究。

至此,關(guān)于SpringBoot內(nèi)置服務(wù)器的相關(guān)知識(shí)解析就到此了。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入Java Robot實(shí)現(xiàn)控制鼠標(biāo)和鍵盤的方法詳解

    深入Java Robot實(shí)現(xiàn)控制鼠標(biāo)和鍵盤的方法詳解

    本篇文章是對(duì)Java中用Robot實(shí)現(xiàn)控制鼠標(biāo)和鍵盤的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 一文帶你快速學(xué)會(huì)JDBC及獲取連接的五種方式

    一文帶你快速學(xué)會(huì)JDBC及獲取連接的五種方式

    JDBC(Java Database Connectivity)是一個(gè)獨(dú)立于特定數(shù)據(jù)庫管理系統(tǒng)、通用的SQL數(shù)據(jù)庫存取和操作的公共接口,下面這篇文章主要給大家介紹了關(guān)于如何通過一文帶你快速學(xué)會(huì)JDBC及獲取連接的五種方式,需要的朋友可以參考下
    2022-09-09
  • Java使用組合模式實(shí)現(xiàn)表示公司組織結(jié)構(gòu)功能示例

    Java使用組合模式實(shí)現(xiàn)表示公司組織結(jié)構(gòu)功能示例

    這篇文章主要介紹了Java使用組合模式實(shí)現(xiàn)表示公司組織結(jié)構(gòu)功能,簡(jiǎn)單描述了組合模式的概念、功能并結(jié)合實(shí)例形式分析了Java使用組合模式實(shí)現(xiàn)公司組織結(jié)構(gòu)表示功能具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • SpringBoot+SpringSecurity 不攔截靜態(tài)資源的實(shí)現(xiàn)

    SpringBoot+SpringSecurity 不攔截靜態(tài)資源的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot+SpringSecurity 不攔截靜態(tài)資源的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 淺談Java內(nèi)省機(jī)制

    淺談Java內(nèi)省機(jī)制

    本文主要介紹了Java內(nèi)省機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • SpringBoot集成Mybatis的實(shí)現(xiàn)步驟

    SpringBoot集成Mybatis的實(shí)現(xiàn)步驟

    這篇文章主要介紹了SpringBoot集成Mybatis的實(shí)現(xiàn)步驟,本文通過SpringBoot +MyBatis 實(shí)現(xiàn)對(duì)數(shù)據(jù)庫學(xué)生表的查詢操作,需要的朋友可以參考下
    2020-12-12
  • druid連接池的參數(shù)配置示例全面解析

    druid連接池的參數(shù)配置示例全面解析

    這篇文章主要為大家介紹了druid連接池的參數(shù)配置示例全面解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Mybatis遷移到Mybatis-Plus的實(shí)現(xiàn)方法

    Mybatis遷移到Mybatis-Plus的實(shí)現(xiàn)方法

    這篇文章主要介紹了Mybatis遷移到Mybatis-Plus的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java從內(nèi)存角度帶你理解數(shù)組名實(shí)質(zhì)是個(gè)地址的論述

    Java從內(nèi)存角度帶你理解數(shù)組名實(shí)質(zhì)是個(gè)地址的論述

    這篇文章主要介紹了Java如何從內(nèi)存解析的角度理解“數(shù)組名實(shí)質(zhì)是一個(gè)地址”,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • java webApp異步上傳圖片實(shí)現(xiàn)代碼

    java webApp異步上傳圖片實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java webApp異步上傳圖片實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評(píng)論