最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用SpringBoot內置web服務器

 更新時間:2021年09月26日 12:03:46   作者:喜歡火影的木易楊  
這篇文章主要介紹了使用SpringBoot內置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定義:判斷環(huán)境中是否引入了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,意思就是當環(huán)境中有Tomcat滿足的依賴時就會優(yōu)先使用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,那么就會觸發(fā)一個WebServerFactoryCustomizerBeanPostProcessor后置處理器,在這個后置處理器中會遍歷這些WebServerFactoryCustomizer并且執(zhí)行內部customize方法,從而跳過自動配置,轉為進行自定義配置:

三、內嵌Web服務器如何切換(從tomcat到jetty)?

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

但是我們如果不想用Tomcat作為默認服務器,例如想切換為Jetty,那么我們應該怎么辦呢?

我們可以把Tomcat的相關依賴在pom.xml中的spring-boot-starter-web中剔除掉,使環(huán)境不再擁有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),具體的配置細節(jié)不做描述,主要對端口,協(xié)議,tomcat組件對象等進行初始化并封裝:

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

對初始化好的tomcat進行封裝并啟動:

最后將這個tomcat對象封裝為一個TomcatWebServer對象供SpringBoot啟動時調用。

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

封裝到一個WebServer對象中供SpringBoot啟動時調用。

五、web容器啟動源碼解析?

SpringBoot是什么時候運行了一個web服務器呢?這個要從SpringBootApplication.run()方法進行分析。以tomcat為例按照上面提到的,這個啟動過程應該會調用到TomcatServletWebServerFactory.getWebServer方法獲取這么一個tomcat實例。

調用鏈可看下面圖示:

SpringBootApplication.run():

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

初始化AnnotationConfigServletWebApplicationContext之后,在構造函數調用這個context的refresh方法-->onRefresh方法:

調用onRefresh方法,就會調用到ServletWebServerApplicationContext的onRefresh方法,在這個方法內,就對web服務器進行了創(chuàng)建操作createWebServer():

在createWebServer()方法中,會判斷是外置還是內置方式發(fā)布應用,分別進行不同的邏輯操作。我們這里以內置來學習:

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

綜上:在SpringBoot的run啟動時,會判斷當前所處環(huán)境。

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

如果是內置方式則通過TomcatServletWebServerFactory工廠類來獲取一個首選的web服務器,然后進行服務器的初始化配置,應用加載生效以及服務器啟動的操作。

六、SpringBoot內置服務器不使用SPI機制特別說明?

最后還有一個結論要記?。簩τ赟pringBoot內置服務器不會通過SPI的機制(官網也有特別說明),因為SpringBoot內置服務器是SpringBoot自己幫我們創(chuàng)建了web服務器來發(fā)布應用,不使用SPI機制的目的就是盡可能減少內置和外置web服務器可能存在的沖突,讓web應用由SpringBoot自己來管理。詳細原因和原理這里不做研究。

至此,關于SpringBoot內置服務器的相關知識解析就到此了。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • springboot項目不同環(huán)境的配置讀取方式

    springboot項目不同環(huán)境的配置讀取方式

    SpringBoot支持application.properties、application.yml、application.yaml三種配置文件類型,可同時存在并合并配置,配置文件的讀取優(yōu)先級為:application.properties > application.yml > application.yaml,不同位置的相同類型配置文件
    2024-11-11
  • SpringBoot整合EasyExcel實現文件導入導出

    SpringBoot整合EasyExcel實現文件導入導出

    這篇文章主要介紹了SpringBoot整合EasyExcel實現文件導入導出的方法,幫助大家更好的理解和學習使用SpringBoot,感興趣的朋友可以了解下
    2021-05-05
  • Java中精確的浮點運算操作示例

    Java中精確的浮點運算操作示例

    這篇文章主要介紹了Java中精確的浮點運算操作方法,結合具體實例形式分析了java浮點數運算的相關函數、使用技巧與注意事項,需要的朋友可以參考下
    2017-06-06
  • IDEA錯誤:找不到或無法加載主類的完美解決方法

    IDEA錯誤:找不到或無法加載主類的完美解決方法

    使用IDEA開始就一直在搭建java環(huán)境,許久沒有使用過java,剛開始有些生疏,先建了一個最簡單的類可是運行的時候出現錯誤:找不到或無法加載主類,下面這篇文章主要給大家介紹了關于IDEA錯誤:找不到或無法加載主類的完美解決方法,需要的朋友可以參考下
    2022-07-07
  • 詳解如何配置springboot跳轉html頁面

    詳解如何配置springboot跳轉html頁面

    這篇文章主要介紹了詳解如何配置springboot跳轉html頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • java字符串與格式化輸出的深入分析

    java字符串與格式化輸出的深入分析

    本篇文章是對java字符串與格式化輸出進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • 詳解SpringBoot實現JPA的save方法不更新null屬性

    詳解SpringBoot實現JPA的save方法不更新null屬性

    直接調用原生Save方法會導致null屬性覆蓋到數據庫,使用起來十分不方便。本文詳細的介紹了如何解決這個問題,非常具有實用價值,需要的朋友可以參考下
    2018-12-12
  • 在Action中以Struts2的方式輸出JSON數據的實例

    在Action中以Struts2的方式輸出JSON數據的實例

    下面小編就為大家?guī)硪黄贏ction中以Struts2的方式輸出JSON數據的實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • SpringCloud服務注冊和發(fā)現組件Eureka

    SpringCloud服務注冊和發(fā)現組件Eureka

    對于微服務的治理而言,其核心就是服務的注冊和發(fā)現。在SpringCloud 中提供了多種服務注冊與發(fā)現組件,官方推薦使用Eureka。本篇文章,我們來講解springcloud的服務注冊和發(fā)現組件,感興趣的可以了解一下
    2021-05-05
  • Session過期后自動跳轉到登錄頁面的實例代碼

    Session過期后自動跳轉到登錄頁面的實例代碼

    這篇文章主要介紹了Session過期后自動跳轉到登錄頁面實例代碼,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06

最新評論

永定县| 德化县| 栾川县| 浏阳市| 宁安市| 江山市| 巩义市| 甘肃省| 霍林郭勒市| 永靖县| 呈贡县| 铁岭县| 鄂托克前旗| 商都县| 连南| 景泰县| 霍邱县| 镶黄旗| 科技| 大名县| 湟源县| 肇源县| 临沧市| 遂川县| 丰台区| 赤壁市| 章丘市| 红河县| 凌海市| 祁阳县| 舒城县| 温宿县| 罗江县| 晋中市| 平和县| 宣汉县| 吉水县| 高州市| 龙岩市| 沈丘县| 吴堡县|