高清视频在线观看免费播放器-伊人日本-色九月综合-18禁止看的免费污网站-免费观看性行为视频的网站-天天碰天天操-久久精品国产欧美日韩99热-中文字幕在线视频不卡-国产偷人妻精品一区二区在线-国内精品久-伊人影院在线看-密臀av一区-久久综合五月丁香久久激情-福利一区福利二区-gg国产精品国内免费观看-国产精品 高清 尿 小便 嘘嘘

當前位置: 首頁 >觀察 > 正文

深度解析SpringBoot內(nèi)嵌Web容器|每日速遞

2023-06-26 18:08:56 來源:博客園

你好,我是劉牌!

前言

今天分享一個SpringBoot的內(nèi)嵌Web容器,在SpringBoot還沒有出現(xiàn)時,我們使用Java開發(fā)了Web項目,需要將其部署到Tomcat下面,需要配置很多xml文件,SpringBoot出現(xiàn)后,就從繁瑣的xml文件中解脫出來了,SpringBoot將Web容器進行了內(nèi)嵌,我們只需要將項目打成一個jar包,就可以運行了,大大省略了開發(fā)成本,那么SpringBoot是怎么實現(xiàn)的呢,我們今天就來詳細介紹。


(資料圖片)

SpringBoot提供的內(nèi)嵌容器

SpringBoot提供了四種Web容器,分別為Tomcat,Jetty,Undertow,Netty。

Tomcat

Spring Boot 默認使用 Tomcat 作為嵌入式 Web 容器。Tomcat 作為一個流行的 Web 容器,容易能夠理解、配置和管理。可以通過使用spring-boot-starter-web來啟用 Tomcat 容器。

Jetty

Jetty 同樣是一個流行的嵌入式 Web 容器,它的缺省配置相對精簡,從而有利快速啟動。可以通過使用spring-boot-starter-jetty來啟用 Jetty 容器。

Undertow

Undertow 是一個由 JBoss 開發(fā)的輕量級的嵌入式 Web 服務器。它具有出色的性能和低資源占用率,是一個適合微服務實現(xiàn)的 Web 服務器。可以使用spring-boot-starter-undertow來啟用 Undertow 容器。

Netty

Netty是一個高性能的網(wǎng)絡框架,需要引入spring-boot-starter-webflux和spring-boot-starter-reactor-netty來開啟Netty作為Web容器。

使用

因為SpringBoot默認的是Tomcat作為Web容器,如果我們需要使用使用其他Web容器,那么需要排除Tomcat容器,再引入其他容器,Tomcat容器位于spring-boot-starter-web模塊下,所以我們需要在maven的pom.xml中移除Tomcat,如下。

      org.springframework.boot      spring-boot-starter-web      3.0.2                              org.springframework.boot              spring-boot-starter-tomcat                

然后引入對應的Web容器,比如引入Undertow

      org.springframework.boot      spring-boot-starter-undertow

然后可以在yml文件中配置相應容器的參數(shù),如下配置undertow.

server:  port: 8080  undertow:    threads:      worker: 10      io: 10    direct-buffers: true

其他web容器可以根據(jù)實際情況配置,從ServerProperties配置文件中可以查看對應的Web容器的相關配置。

源碼解析

下面從源碼進行分析,我們先使用SpringBoot的默認Web容器Tomcat進行分析。

那么源碼應該從哪里看起呢,對于SpringBoot這么龐大復雜的項目,首先,我們在使用SpringBoot的時候,需要在application.yml文件中配置相關信息,比如端口,如果不配置端口,默認是8080,那么這個端口肯定是web容器的端口,如果是Tomcat,那么Tomcat就設置為這個端口,Undertow也是,依此類推。

那么這里就是一個入口,在SpringBoot中,我們要獲取yml文件中的配置信息,一般是通過@ConfigurationProperties注解,我們可以按住ctrl,然后鼠標點擊這個port,就能跳到對應的屬性類里面。

屬性類ServerProperties就是專門獲取yml文件中的配置,然后以供使用。

到了屬性類里面后,我們繼續(xù)ctrl,然后會彈出很多類,如下所示。

因為我們使用的是Tomcat,那么就選擇一個Tomcat相關的類,我們選擇TomcatWebServerFactoryCustomizer,這個類實現(xiàn)了接口WebServerFactoryCustomizer,并實現(xiàn)了方法customize。

customize的參數(shù)是ConfigurableTomcatWebServerFactory,它是一個接口,它還繼承了接口ConfigurableWebServerFactory,我們從ConfigurableWebServerFactory中看出里面有設置端口,地址等方法。

我們再回頭看ConfigurableTomcatWebServerFactory,可以看出里面是一些Tomcat相關的方法。

然后繼續(xù)看ConfigurableUndertowWebServerFactory,可以看出里面是對Undertow的一些屬性設置的方法。

我們回到TomcatWebServerFactoryCustomizer類中,SpringBoot使用了它的PropertyMapper類對屬性進行設置,我們可以看出它使用propertyMapper.from().to()語法,其實就是將ServerProperties中的屬性設置到ConfigurableTomcatWebServerFactory中,這個屬性設置是在Spring對Bean進行初始化時候設置的,使用的是Spring的后置處理器來實現(xiàn)的,后面我們繼續(xù)說。

然后我們繼續(xù)看一下TomcatWebServerFactoryCustomizer,他有一個構造函數(shù),參數(shù)是Environment和ServerProperties,那么就證明其他地方對其進行了new操作。

我們也是用ctrl套路,點擊構造函數(shù)后跳到了EmbeddedWebServerFactoryCustomizerAutoConfiguration自動裝配類中,這個類中有四個靜態(tài)類,我們可以看出,他們的作用都是創(chuàng)建對應的定制器Bean,其實就是將yml文件中的Web容器配置進行裝配,以供后面使用。

上面說的這一堆其實就是SpringBoot的自動裝配,其目的就是創(chuàng)建對應的Customizer,因為每個Web容器的配置項不一樣,所以就需要不同的Customizer和Factory。

上面說了這么多,怎么感覺和源碼沒關系呢,沒錯,其實上面說的并不是核心源碼,那么怎么找到核心源碼呢?我們思考一下,既然上面是部分源碼,那么源碼肯定會執(zhí)行到這里。

查看調用鏈

我們在上面的TomcatWebServerFactoryCustomizer類中的customize方法中打一個斷點,然后debug,于是得到調用鏈如下。

我們可以看出會調用onRefresh()方法,因為AbstractApplicationContext使用的是模板方法模式,具體的實現(xiàn)交給子類實現(xiàn),因為使用的是Tomcat,所以交給了ServletWebServerApplicationContext類來實現(xiàn),具體的子類里面有一個createWebServer()方法,它就是創(chuàng)建Web容器。

具體實現(xiàn)如下,如下是Tomcat的實現(xiàn),里面會涉及到兩個重要的接口WebServerWebServerFactory

WebServer

WebServer是容器的頂層接口,具體實現(xiàn)交給具體的容器實現(xiàn)類,如Tomcat則使用TomcatWebServer,Undertow則使用UndertowWebServer,Jetty,Netty也是如此。

此接口提供了一些方法,start()啟動Web服務器,stop()停止Web服務器,getPort()獲取服務器端口。

不過對于start()和stop(),它們只是接口抽象的規(guī)范,在具體的實現(xiàn)中,也并不是全部都按照這個標準,start()方法上有備注Starts the web server. Calling this method on an already started server has no effect.,翻譯為:啟動web服務器。在已啟動的服務器上調用此方法無效。,比如Tomcat的就沒有在start()方法中啟動服務器,具體我們等會會看。

WebServerFactory

WebServerFactory是一個接口,沒有定義任何方法,它就創(chuàng)建Web服務器的工廠的標記接口,Spring中很多地方也是這樣的風格。

這個接口重要的兩個子接口,也是我們需要關注的兩個子接口分別是ServletWebServerFactoryReactiveWebServerFactory,它們兩個都定義了一個方法getWebServer

JettyUndertowTomcat三個都屬于Servlet容器,所以使用的是ServletWebServerFactory來創(chuàng)建Web容器。

Netty不是Servlet容器,所以使用的是ReactiveWebServerFactory來創(chuàng)建Web容器。

上面對這兩個接口進行了介紹,基本上整個Web容器都是圍繞這兩個接口來,我們下面繼續(xù)分析。

獲取WebServerFactory

首先我們要先獲取web服務的工廠類的Bean,才能創(chuàng)建Web容器,因為我們使用的是Tomcat,所以獲取到的工廠類是TomcatServletWebServerFactory,具體的獲取Bean的過程我們就沒有必要去一一說明,只要對Spring IOC稍微熟悉一點就能理解,我們主要說一下在后置處理器。

上面我們介紹了Tomcat容器的定制器Customizer,里面對Web容器的配置屬性進行組裝,它就是發(fā)生在Bean的初始化前,用到的Bean后置處理器是WebServerFactoryCustomizerBeanPostProcessor

Bean的后置處理器中,會調用對應的定制器,Tomcat調用的就是TomcatWebServerFactoryCustomizer,其他的也一樣,其目的都是定制WebServerFactory。

經(jīng)過一系列處理后,就從IOC容器中獲取到了WebServerFactoryBean,然后再使用這個工廠去創(chuàng)建Web服務。

創(chuàng)建Web服務

獲取到WebServerFactory后,就可以創(chuàng)建Web容器,因為使用的是Tomcat,所以使用的是TomcatServletWebServerFactory,如下,我們就看到了Tomcat的身影。

最后啟動Tomcat容器是在TomcatWebServer中,在TomcatWebServer的構造函數(shù)中調用initialize(),在initialize()中我們看是this.tomcat.start(),Tomcat被啟動了。

上面我們在說WebServer接口的時候,說了啟動start()方法,在Tomcat的實現(xiàn)中就沒有使用start()來啟動容器,但是在Undertow中,就使用了start()方法來啟動容器。

Undertow容器啟動

上面我們介紹了Tomcat容器的創(chuàng)建,Undertow的流程和Tomcat基本上是一樣的,但是在啟動的時候,Undertow是在start()方法中啟動,而start()方法需要在finishRefresh()這一步中執(zhí)行。

在finishRefresh()中,會調用生命周期處理器

最終會走到WebServerStartStopLifecycle這個生命周期,這里就會調用WebServer中的start()方法。

最終在UndertowWebServer中啟動Undertow容器

具體執(zhí)行順序如下。

finishRefresh() -> getLifecycleProcessor().onRefresh() -> startBeans(true) -> start() -> doStart(this.lifecycleBeans, member.name, this.autoStartupOnly) -> bean.start() -> this.webServer.start()

上面我們分析了Tomcat和Undertow的創(chuàng)建流程,Jetty和Netty也是大同小異,因為Spring使用了模板方法模式,具體的實現(xiàn)交給具體的Web容器,所以在整體結構上是差不多的,只是實現(xiàn)方式不同。

總結

關于SpringBoot的內(nèi)嵌Web容器,就說得差不多了,我們從各種Web容器進行介紹,包括他們的有點,怎么在SpringBoot中使用,并對源碼進行解析,在源碼解析這里,我們并沒有進行芝麻細節(jié)式解析,而是從大體上進行解析,只有對大致結構了解,才能更好地進行深度學習。

SpringBoot內(nèi)嵌容器涉及的知識點還是比較多,需要對Spring和SpringBoot有一定的了解才能更好地學習它,本文基于SpringBoot3.0進行解析,SpringBoot3.0中,Servlet也是遵循Jakata EE規(guī)范。

今天的分享就到這里,感謝你的觀看,我們下期見,如果文中有不對或者不合理的地方,希望得到你的指點,我們一起在學習中成長,一起在成長中學習。

標簽:

返回頂部
高清视频在线观看免费播放器-伊人日本-色九月综合-18禁止看的免费污网站-免费观看性行为视频的网站-天天碰天天操-久久精品国产欧美日韩99热-中文字幕在线视频不卡-国产偷人妻精品一区二区在线-国内精品久-伊人影院在线看-密臀av一区-久久综合五月丁香久久激情-福利一区福利二区-gg国产精品国内免费观看-国产精品 高清 尿 小便 嘘嘘
  • <cite id="ecweg"><pre id="ecweg"></pre></cite>
    <rt id="ecweg"><acronym id="ecweg"></acronym></rt>
  • <rt id="ecweg"></rt>
    奇米777四色影视在线看| 成人在线国产视频| 亚洲精品一二三四五区| 日本黄xxxxxxxxx100| www.cao超碰| 亚洲综合欧美在线| 亚洲精品在线网址| 日韩av福利在线观看| 欧美视频国产视频| 三年中国中文在线观看免费播放| 激情图片中文字幕| 国产69精品久久久久久久| 亚洲五码在线观看视频| 男人亚洲天堂网| 国产精品人人妻人人爽人人牛| 熟妇人妻va精品中文字幕| jizzzz日本| av动漫免费观看| 国产在线视频综合| 国产在线观看福利| 亚洲午夜精品一区| 鲁一鲁一鲁一鲁一色| 国产真实乱子伦| 日本一本在线视频| 日本少妇高潮喷水视频| 亚洲欧洲日本精品| 蜜桃视频成人在线观看| 天天影视综合色| 精品久久免费观看| 女性女同性aⅴ免费观女性恋 | 国产极品美女高潮无套久久久| 另类小说第一页| 六月婷婷激情综合| 亚洲国产精品影视| 尤物av无码色av无码| 久久www视频| 日韩精品一区二区三区不卡 | 久青草视频在线播放| 国产理论在线播放| 鲁一鲁一鲁一鲁一色| 亚洲 国产 图片| 成 人 黄 色 小说网站 s色| 国产网站免费在线观看| 欧洲在线免费视频| 中文久久久久久| 免费在线观看亚洲视频| 欧美另类videos| 亚洲18在线看污www麻豆| 精品人妻一区二区三区四区在线| 国产91沈先生在线播放| 超碰10000| 国产九九在线观看| www.亚洲天堂网| 亚洲高清在线免费观看| 超碰成人免费在线| 精品免费久久久久久久| 搞av.com| 国产日产欧美视频| 国产精品网站免费| 97视频久久久| 和岳每晚弄的高潮嗷嗷叫视频| av免费观看国产| 国产免费成人在线| 天天干天天爽天天射| www.欧美日本| 性久久久久久久久久久久久久| 日韩av片网站| 久久人人爽av| 亚洲一级片av| 91小视频在线播放| 午夜影院免费观看视频| 男女激烈动态图| 欧美日本视频在线观看| 超碰av在线免费观看| heyzo国产| 九九九久久久久久久| 色婷婷综合在线观看| 黄色片免费在线观看视频| 国产成人精品视频免费看| 蜜臀av免费观看| 亚洲第一成肉网| 欧美牲交a欧美牲交aⅴ免费真| 亚洲视频一二三四| 日韩成人av免费| 春日野结衣av| 91丝袜超薄交口足| 欧美日韩大尺度| 日本久久高清视频| jizz18女人| 免费极品av一视觉盛宴| 欧美黄网站在线观看| 日韩视频一二三| 亚欧在线免费观看| 久久国产精品免费观看| 国产肥臀一区二区福利视频| 超碰成人在线播放| 18禁裸男晨勃露j毛免费观看| av视屏在线播放| 99热在线这里只有精品| www.99r| 国产精品999视频| 亚洲精品少妇一区二区| 丰满人妻中伦妇伦精品app| 久久精品无码中文字幕| 一级黄色免费在线观看| www.久久av.com| 91视频最新入口| 欧美日韩中文字幕在线播放| 国产精品igao| 91av俱乐部| 欧美啪啪免费视频| 91大学生片黄在线观看| 手机免费av片| 香蕉视频在线网址| 最近免费观看高清韩国日本大全| 波多野结衣在线免费观看| 亚洲a级黄色片| 国产永久免费网站| 日本久久久久久久久久久久| 免费看a级黄色片| 少妇av一区二区三区无码| 我的公把我弄高潮了视频| 日本特级黄色大片| 波多野结衣在线免费观看| 欧美日韩中文不卡| 九九热视频免费| 亚洲日本黄色片| 国产www免费| 男女午夜激情视频| 五月丁香综合缴情六月小说| 久久综合九色综合88i| 日韩视频免费播放| 日韩精品一区二区三区不卡| 六月丁香激情网| 色播五月激情五月| 超薄肉色丝袜足j调教99| 亚洲色欲久久久综合网东京热| 中国一级黄色录像| 裸体裸乳免费看| 日韩a级黄色片| 国产精品久久中文字幕| 欧美日韩激情视频在线观看| 九九精品久久久| 777av视频| 成年人在线看片| 青青青在线视频免费观看| 色一情一区二区三区| 久青草视频在线播放| jizz欧美激情18| 成年丰满熟妇午夜免费视频| 欧美亚洲色图视频| 韩国视频一区二区三区| wwwwww欧美| 欧美 国产 日本| 在线播放av中文字幕| 亚洲精品国产suv一区88| 97成人在线观看视频| 天天做天天干天天操| 国产 欧美 日本| 日本中文字幕片| 国产一区二区片| 免费久久久久久| 国产亚洲天堂网| 日本一区二区免费高清视频| 东北少妇不带套对白| 亚洲第一天堂久久| 日韩精品无码一区二区三区免费| 国产女同无遮挡互慰高潮91| 女人扒开屁股爽桶30分钟| 久久精品国产99久久99久久久| 99在线精品免费视频| 中文字幕一区二区三区四| 成年人视频观看| 黄色www在线观看| 一女二男3p波多野结衣| 国产精品动漫网站| 国产精品国产亚洲精品看不卡| 福利在线小视频| 色国产在线视频| 亚洲欧美偷拍另类| 污污的视频免费观看| 国内性生活视频| av免费观看网| 国产欧美精品aaaaaa片| 91看片破解版| 1314成人网| 五月婷婷丁香综合网| 国产精品免费观看久久| 欧美a v在线播放| 亚洲色欲综合一区二区三区| 国产又大又硬又粗| www.日本xxxx| 日本熟妇人妻xxxxx| 精品中文字幕av| 一女被多男玩喷潮视频| 成人小视频在线观看免费| 91猫先生在线| 伊人国产在线视频| 国产精品av免费| 欧美大片免费播放|