国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 使用SpringBoot內(nèi)置web服務(wù)器

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

2022-01-19 10:37喜歡火影的木易楊 Java教程

這篇文章主要介紹了使用SpringBoot內(nèi)置web服務(wù)器操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

對Undertow定義:所需要的依賴有Servlet.class, Undertow.class, SslClientAuthMode.class

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

那么問題來了,SpringBoot如果這幾種都有,那是怎么選擇呢?從ServletWebServerFactoryAutoConfiguration配置類

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

通過@Import就可以看出這里定義了一個順序,依次是Tomcat->Jetty->Undertow,意思就是當(dāng)環(huán)境中有Tomcat滿足的依賴時就會優(yōu)先使用Tomcat,依次往后推。

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

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

 

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

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

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

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

對于WebServerFactoryCustomizer在上面ServletWebServerFactoryConfiguration配置類Factory配置Tomcat,Jetty時在注解上會判斷存過存在自己手動添加的ServletWebServerFactory則不再進行自動配置:

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

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

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

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

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

 

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

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

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

我們可以把Tomcat的相關(guān)依賴在pom.xml中的spring-boot-starter-web中剔除掉,使環(huán)境不再擁有Tomcat依賴,同時加入Jetty的依賴那么就能使Jetty作為滿足條件被SpringBoot選擇了。

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

<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服務(wù)器了。

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

封裝到一個WebServer對象中供SpringBoot啟動時調(diào)用。

 

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

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

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

SpringBootApplication.run():

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/qq_20395245/article/details/106816754

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
主站蜘蛛池模板: 免费一区二区 | 自拍偷拍 亚洲 欧美 | 黄色片在线观看视频 | 日韩久久久久久 | 久久久999国产 | 精品一区二区久久 | 欧美性猛交一区二区三区精品 | 亚洲精品视频一区二区三区 | 久久99视频 | 国产精品久久久久久久久久三级 | 中文日韩在线 | 免费福利视频一区二区三区 | 日韩视频在线观看 | 精品福利一区二区三区 | 天天澡天天狠天天天做 | 亚洲成av人影片在线观看 | 亚洲久久一区二区 | 国产精品久久久久久亚洲调教 | 久久精彩免费视频 | 国产精品视频免费 | 久久久久无码国产精品一区 | 日韩精品一区二区三区四区 | 免费福利网站 | 欧美大片免费高清观看 | 亚洲少妇视频 | 日韩欧美在线观看一区二区 | 国产成人毛片 | 日韩精品一区二区三区在线 | 欧美日韩在线免费 | av在线免费观看一区二区 | 狠狠艹| 男人天堂亚洲 | 亚洲成年人网站在线观看 | 久久国产精品一区 | 欧美高清一区 | 午夜视频一区 | 午夜视频在线 | 91亚洲国产成人久久精品网站 | 免费观看黄色av网站 | 色综合视频 | 91在线精品一区二区三区 |