久久久精品视频在线_免费在线a视频_在线看的黄色网址_懂色av粉嫩av浪潮av_艳妇乳肉豪妇荡乳av_国产午夜大地久久_国产在线观看免费播放_天堂视频免费看_久久精品女同亚洲女同13_各处沟厕大尺度偷拍女厕嘘嘘

當(dāng)前位置: 首頁 >觀察 > 正文

深度解析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容器進(jìn)行了內(nèi)嵌,我們只需要將項目打成一個jar包,就可以運行了,大大省略了開發(fā)成本,那么SpringBoot是怎么實現(xiàn)的呢,我們今天就來詳細(xì)介紹。


(資料圖片)

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

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

Tomcat

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

Jetty

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

Undertow

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

Netty

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

使用

因為SpringBoot默認(rèn)的是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                

然后引入對應(yīng)的Web容器,比如引入Undertow

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

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

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

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

源碼解析

下面從源碼進(jìn)行分析,我們先使用SpringBoot的默認(rèn)Web容器Tomcat進(jìn)行分析。

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

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

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

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

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

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

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

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

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

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

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

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

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

查看調(diào)用鏈

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

我們可以看出會調(diào)用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服務(wù)器,stop()停止Web服務(wù)器,getPort()獲取服務(wù)器端口。

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

WebServerFactory

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

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

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

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

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

獲取WebServerFactory

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

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

Bean的后置處理器中,會調(diào)用對應(yīng)的定制器,Tomcat調(diào)用的就是TomcatWebServerFactoryCustomizer,其他的也一樣,其目的都是定制WebServerFactory。

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

創(chuàng)建Web服務(wù)

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

最后啟動Tomcat容器是在TomcatWebServer中,在TomcatWebServer的構(gòu)造函數(shù)中調(diào)用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()中,會調(diào)用生命周期處理器

最終會走到WebServerStartStopLifecycle這個生命周期,這里就會調(diào)用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容器,所以在整體結(jié)構(gòu)上是差不多的,只是實現(xiàn)方式不同。

總結(jié)

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

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

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

標(biāo)簽:

返回頂部
www.久久久久久久| 五月天婷婷丁香网| 久久国产黄色片| 亚洲区成人777777精品| 黄色av小说在线观看| 九九久久久久久| 极品盗摄国产盗摄合集| 色婷婷在线视频| 天天爽夜夜爽夜夜爽精品| 黄色成人在线免费观看| 国产极品一区二区| 中文区中文字幕免费看| 波多野结衣xxxx| 成熟的女同志hd| 亚洲成a人无码| 欧美性猛交xxxx乱大交hd| 国产aaa一级片| 欧美a视频在线观看| 亚洲 自拍 另类小说综合图区| 丰满人妻熟女aⅴ一区| 日韩欧美中文视频| 超薄肉色丝袜足j调教99| 91人妻一区二区| 7777久久亚洲中文字幕| 日韩av影视大全| 浴室偷拍美女洗澡456在线| 一级全黄少妇性色生活片| 亚洲最大综合网| 国产一二三四视频| 在线观看国产小视频| 日本黄大片一区二区三区| 污软件在线观看| 亚洲丝袜在线观看| 日本一级黄色录像| 成年人视频网站免费观看| 亚欧洲乱码视频| 天天干天天舔天天射| 中文字幕在线播放av| 青娱乐国产盛宴| 免费一区二区三区在线观看| 女女同性女同一区二区三区按摩| 亚洲av成人片色在线观看高潮| 精品免费久久久| 国产一区二区自拍视频| 99视频在线看| 国产成人啪精品午夜在线观看| 777米奇影视第四色| 国产在线xxxx| 喜爱夜蒲2在线| 三上悠亚在线观看视频| 色婷婷国产精品免| 少妇太紧太爽又黄又硬又爽小说| 国产极品一区二区| 少妇精品无码一区二区三区| 姝姝窝人体www聚色窝| 性网爆门事件集合av| 超碰在线播放97| 天天操天天插天天射| 婷婷综合激情网| 黑森林av导航| 亚洲精品理论片| 中文字幕第69页| 久草福利资源在线| 欧洲金发美女大战黑人| bt天堂新版中文在线地址| 国产真人做爰毛片视频直播| 欧美日韩二三区| 亚洲a级黄色片| 日韩欧美三级在线观看| 成人免费一区二区三区| 亚洲欧美激情另类| 97人妻精品一区二区三区免 | 欧美视频在线播放一区| 中国黄色片免费看| 精国产品一区二区三区a片| 久久狠狠高潮亚洲精品| 神马久久久久久久| 国产激情久久久久久熟女老人av| а√天堂资源在线| 亚欧洲乱码视频| 男女啪啪的视频| 国产精品69页| 欧产日产国产69| 天天爽夜夜爽夜夜爽| 欧美狂猛xxxxx乱大交3| 午夜啪啪免费视频| 久久久久免费精品| 九九热精品视频在线| 97超视频在线观看| 亚洲 美腿 欧美 偷拍| 欧美激情 一区| 成人免费观看在线| 日韩免费av片| 亚洲av成人无码久久精品老人 | wwwwww欧美| 国产在线观看免费视频今夜| 少妇av在线播放| 日韩女优一区二区| 自拍一级黄色片| 秋霞视频一区二区| 国产精品第157页| 久草视频在线观| 90岁老太婆乱淫| 午夜在线观看av| 亚洲色图狠狠干| 亚洲五码在线观看视频| 一级黄色免费网站| 亚洲欧美va天堂人熟伦 | 日韩一级免费视频| 国产av国片精品| 精品人妻一区二区三区四区不卡 | 亚洲在线观看网站| www.88av| 久久国产精品波多野结衣| 国产人成视频在线观看| 亚洲午夜激情影院| 亚洲男女在线观看| 亚洲欧美一区二区三区不卡| 玖玖爱在线精品视频| 国产5g成人5g天天爽| 欧美熟妇精品黑人巨大一二三区| 8x8x成人免费视频| 亚洲综合网在线观看| 精品视频在线观看免费| 色婷婷av777| 色婷婷av国产精品| 国精品人伦一区二区三区蜜桃| 青娱乐国产盛宴| 日韩激情小视频| 97超碰中文字幕| 免费看污污网站| 在线免费观看a级片| 久久国产黄色片| 亚洲精品少妇一区二区| 日本免费一区视频| 五月天国产视频| 爱爱爱视频网站| 无码人妻一区二区三区在线视频| 国产美女18xxxx免费视频| 日日操免费视频| 国产视频在线观看免费| 欧美婷婷精品激情| 999久久久国产| 天天操天天干天天操| 久久国产免费观看| 丰满人妻一区二区三区53号| 欧美一区二区黄片| 日韩乱码在线观看| 国产原创中文在线观看| 国精产品一区一区三区免费视频| 五月婷婷六月婷婷| 青青草精品视频在线观看| 影音先锋男人看片资源| 男插女视频网站| 波多野结衣家庭主妇| 日本黄大片一区二区三区| 日本黄色小说视频| 黄色短视频在线观看| 中文字幕一区二区三区免费看| www.欧美日本| 美女黄色免费看| 午夜精品一区二区三区视频| 中国xxxx性xxxx产国| www日本视频| 国产成人免费观看视频| 中文字幕第100页| 日本阿v视频在线观看| 特级西西人体高清大胆| 国产精品第七页| 欧美一区,二区| 国产精品丝袜黑色高跟鞋| 国产精品21p| 日韩成人av毛片| 欧美精品99久久久| 成年网站免费在线观看| 国产成人av影视| 日韩 欧美 高清| 国产日产欧美视频| 妞干网在线视频观看| 992tv成人免费观看| 欧美h片在线观看| 又色又爽的视频| 欧美午夜激情影院| 东京热无码av男人的天堂| 不卡一区二区在线观看| 最新中文字幕视频| 久久久久久久毛片| 成人黄色短视频| 成人在线观看高清| 永久免费在线看片视频| 天天爱天天做天天操| 国产在线无码精品| 丁香花在线影院观看在线播放| 亚洲 欧美 综合 另类 中字| 久草视频国产在线| 激情综合网婷婷| 九九视频精品在线观看| 91看片就是不一样| 免费看一级一片| 黄色av一级片| 亚洲国产精品二区| 无码国产精品一区二区免费式直播| 精品国产免费久久久久久婷婷| 中文字幕在线观看网址| 一级性生活免费视频| 免费人成自慰网站| 欧美成人乱码一二三四区免费| 人人干人人干人人干| 国产美女三级无套内谢| 亚洲精品无码久久久久久久| 国产jk精品白丝av在线观看| 91社在线播放| 亚洲免费999| 中文字幕在线播| 亚洲人在线观看视频| 老司机精品免费视频| 欧美 国产 综合| 国产午夜福利精品| 亚洲成人中文字幕在线| 日本少妇xxxxx| www.国产区| 中文字幕无线码一区| 亚洲图片综合网| 成人免费播放器| 成年人视频在线免费看| 天堂va欧美va亚洲va老司机| 日本午夜视频在线观看| 成人免费看片98| 国产男女猛烈无遮挡| 中文字幕一二三四区| 黄色片网址在线观看| 欧美激情国产精品免费| 深爱激情五月婷婷| 国产在线无码精品| 久久久免费高清视频| 在线观看国产免费视频| 99精品视频播放| 国产又粗又大又爽| 青青青视频在线播放| 久久久国产精华液| 国产av一区二区三区传媒| 免费拍拍拍网站| 91 中文字幕| 欧洲猛交xxxx乱大交3| 丁香六月婷婷综合| 中文字幕网站在线观看| 亚洲制服在线观看| 日本精品一二三区| 欧美女同在线观看| 黄色片子免费看| 国产淫片av片久久久久久| 欧美 日韩 国产 在线| 欧美大黑帍在线播放| 国产精品丝袜黑色高跟鞋| 日本老太婆做爰视频| 国产又黄又爽视频| 国产自产在线视频| 国产视频在线一区| 日本精品一区在线观看| 人妻中文字幕一区| 色婷婷一区二区三区av免费看| 久久aaaa片一区二区| 欧美三级理论片| 人妻 日韩 欧美 综合 制服| 四虎成人在线播放| xxxxx99| 无码人妻精品一区二区三区蜜桃91 | www.色婷婷.com| 欧在线一二三四区| 小毛片在线观看| 在线观看日韩中文字幕| 日本天堂免费a| 香蕉视频免费看| 中文字幕第22页| 亚洲欧洲综合网| 国产精品一区二区人人爽| 人妻精品无码一区二区三区 | 日本中文在线播放| 黄色一级片在线看| 日本一二三四区视频| 三级av在线免费观看| 亚洲国产精品国自产拍久久| 男生操女生视频在线观看| 久久精品—区二区三区舞蹈| 伊人22222| 天天干天天操天天做| 精品国产视频在线观看| 亚洲女同志亚洲女同女播放| 亚洲热在线视频| 久久99中文字幕| 国产精品av久久久久久无| 国产99视频在线| 久久精品欧美一区二区| 黄色一级视频片| 神马久久精品综合| 波多野结衣电影免费观看| japanese国产在线观看| 亚洲欧美aaa| 国产亚洲综合视频| 天天看片中文字幕| 国产艳俗歌舞表演hd| 欧美 日韩 国产 成人 在线 91| 4438国产精品一区二区| 国内自拍视频一区| 2018国产在线| av磁力番号网| 麻豆视频免费在线播放| 91丝袜在线观看| 宇都宫紫苑在线播放| av中文字幕第一页| 男操女视频网站| 亚洲欧美综合自拍| 欧美成人aaaaⅴ片在线看| 一级黄色片在线免费观看| 激情网站五月天| 妺妺窝人体色www在线小说| 欧美日韩一级在线| 天天舔天天操天天干| 亚洲永久精品ww.7491进入| 国产精品手机在线观看| 色哟哟视频在线| 亚洲天堂2024| 伊人网综合视频| 精品人妻一区二区免费| 中文在线一区二区三区| av黄色一级片| 欧美偷拍一区二区三区| 男人天堂av电影| 亚洲精品国产一区黑色丝袜| 久久久久久国产精品无码| 国产sm调教视频| 国产精品18在线| 欧美一级免费在线观看| 成人国产一区二区三区| 18禁裸男晨勃露j毛免费观看 | 国产a级片视频| 日本xxx在线播放| 四虎地址8848| 国产成人艳妇aa视频在线 | 国产激情视频网站| 亚洲色图第四色| 国产又爽又黄网站| 黄色录像特级片| 妞干网在线免费视频| 黄色在线视频网| 久久久国产高清| 国产乱码精品一区二三区蜜臂 | 99在线免费视频观看| 色婷婷综合久久久久中文字幕 | 手机免费看av网站| 中文字幕免费观看| 日本美女一级片| 色欲狠狠躁天天躁无码中文字幕| 一级黄色录像免费看| 欧美日韩在线不卡视频| 久久精品美女视频| 精品人妻一区二区三区蜜桃| 国产 中文 字幕 日韩 在线| 岛国毛片在线观看| 91小视频在线播放| 亚洲一区二区视频在线播放| av不卡中文字幕| 久久免费一级片| 国产精品50页| 午夜在线视频观看| 三级在线免费观看| 久草视频免费在线播放| 国模无码一区二区三区| 看黄色录像一级片| 不卡中文字幕在线观看| 国产又粗又黄视频| 欧美人妻一区二区三区| 99热手机在线| 99久久亚洲精品日本无码| 538精品视频| 中文字幕资源在线观看| 亚洲黄色精品视频| 中文字幕制服丝袜在线| 久久久全国免费视频| 在线播放av网址| 激情综合在线观看| 国产成人麻豆精品午夜在线| 一区二区三区在线播放视频| 男女视频在线观看网站| 岛国精品一区二区三区| 精品久久久久久久久久中文字幕| 精品成人无码久久久久久| 少妇无套高潮一二三区| 欧美成人精品欧美一级| 在线播放av网址| 午夜精品在线免费观看| 秋霞网一区二区| 人妻内射一区二区在线视频| 欧美特级特黄aaaaaa在线看| 欧美中文字幕在线观看视频| 中文字幕乱码人妻无码久久| 偷拍盗摄高潮叫床对白清晰| 加勒比在线一区| 日韩精品一区二区三区电影| 国产精品高清无码|