日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

idea servlet自动配置web.xml_Spring Boot学习04_嵌入式Servlet容器自动配置原理

發(fā)布時(shí)間:2025/3/21 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 idea servlet自动配置web.xml_Spring Boot学习04_嵌入式Servlet容器自动配置原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在Spring Boot的自動(dòng)配置包下,找到web模塊中的servlet文件夾下的ServletWebServerFactoryConfiguration類

一、嵌入式Servlet容器默認(rèn)的配置原理

1、該類中有三個(gè)靜態(tài)內(nèi)部類(都是配置類):

EmbeddedUndertow、EmbeddedJetty、EmbeddedTomcat

這里拿EmbeddedTomcat來(lái)舉例說(shuō)明

@ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class})

判斷classpath下有沒有Servlet, Tomcat, UpgradeProtocol這三個(gè)類,也就是看maven有沒有引入對(duì)應(yīng)的依賴,如果引入了對(duì)應(yīng)的依賴,下面的配置就生效。(上一篇文章SpringBoot切換嵌入式容器就是根據(jù)這里來(lái)的鏈接)

2、@ConditionalOnMissingBean(
value = {ServletWebServerFactory.class},
search = SearchStrategy.CURRENT
)

如果容器中沒有ServletWebServerFactory這個(gè)組件下面的配置就生效

點(diǎn)進(jìn)ServletWebServerFactory看,該接口只有一個(gè)方法,前面只判斷這個(gè)類型的組件有沒有在容器中,而該類型又只有一個(gè)方法,說(shuō)明最終Spring Boot會(huì)調(diào)用該接口實(shí)現(xiàn)類中的getWebServer方法。

3、查看ServletWebServerFactory接口的實(shí)現(xiàn),有三個(gè)很面熟的實(shí)現(xiàn)類,就是上面ServletWebServerFactoryConfiguration類中要往容器中添加的組件

4、進(jìn)入TomcatServletWebServerFactory類中查看getWebServer方法

首先會(huì)創(chuàng)建一個(gè)Tomcat對(duì)象,給其設(shè)置連接器等一些配置

最終還會(huì)調(diào)用getTomcatWebServer方法

this.getTomcatWebServer(tomcat);

-->return new TomcatWebServer(tomcat, this.getPort() >= 0);

端口號(hào)默認(rèn)是8080所以上面?zhèn)鬟^去的是true,進(jìn)入TomcatWebServer的構(gòu)造方法TomcatWebServer中,在構(gòu)造方法中又調(diào)用了this.initialize();進(jìn)入initialize方法,該方法就會(huì)啟動(dòng)tomcat。(所以這一切都是建立在創(chuàng)建好嵌入式Servlet容器之后)


二、修改SpringBoot初始化嵌入式Servlet容器的默認(rèn)配置原理

上一篇文章(鏈接)中我們自己配置個(gè)WebServerFactoryCustomizer<ConfigurableWebServerFactory>組件就可以實(shí)現(xiàn)修改SpringBoot初始化嵌入式Servlet容器的默認(rèn)配置了,下面開始說(shuō)怎么修改其默認(rèn)配置的。

在ServletWebServerFactoryAutoConfiguration類上面有

@EnableConfigurationProperties,@Import注解

1、@EnableConfigurationProperties({ServerProperties.class})

把ServerProperties注冊(cè)到容器中,并讀取全局配置文件中的數(shù)據(jù)賦值給類中的屬性。

只有一個(gè)有參構(gòu)造,形參的值(serverProperties)會(huì)從容器中獲取,最終交給ServletWebServerFactoryCustomizer類,進(jìn)入ServletWebServerFactoryCustomizer類

該類也是WebServerFactoryCustomizer的子類

里面有個(gè)customize方法會(huì)把從容器中獲取到的servlerProperties中的值拿出來(lái)然后一個(gè)一個(gè)的設(shè)置給factory,最后交給那個(gè)map。

2.1、通過@Import往容器中導(dǎo)入了一個(gè)BeanPostProcessorsRegistrar類,該類中的作用是

bean注冊(cè)后置處理器:Bean初始化前后(創(chuàng)建好對(duì)象,還沒賦值)執(zhí)行初始化工作(容器中某個(gè)組件要?jiǎng)?chuàng)建bean,就會(huì)驚動(dòng)后置處理器,容器中要?jiǎng)?chuàng)建bean這個(gè)才會(huì)觸發(fā),下面的方法才會(huì)被調(diào)用)

2.2、進(jìn)入BeanPostProcessorsRegistrar類查看registerBeanDefinitions方法(注冊(cè)bean的定義),然后調(diào)用registerSyntheticBeanIfMissing方法

2.3、我們點(diǎn)進(jìn)WebServerFactoryCustomizerBeanPostProcessor類中只需要看postProcessBeforeInitialization方法,在bean創(chuàng)建好之后,初始化之前的調(diào)用的方法,該方法首先會(huì)判斷當(dāng)前的bean如果為WebServerFactory類型(我們前面需要往容器中注冊(cè)三個(gè)嵌入式Servlet容器就是該接口的實(shí)現(xiàn)類,所以當(dāng)前這個(gè)bean就是嵌入式的Servlet容器),就調(diào)用postProcessBeforeInitialization方法

2.4、進(jìn)入postProcessBeforeInitialization方法,該方法會(huì)獲得所有的定制器,然后遍歷,調(diào)用每個(gè)定制器的customize方法,并把嵌入式的Servlet容器傳進(jìn)去。

上一篇文章(鏈接)中我們修改嵌入式的Servlet容器的配置也是往容器中添加一個(gè)WebServerFactoryCustomizer組件,并在其customize方法中修改配置。

在前面說(shuō)到通過配置文件來(lái)修改配置也是在WebServerFactoryCustomizer的子類中重寫了

customize方法,并在其customize方法中修改配置。

回到這里的postProcessBeforeInitialization方法,我們這里把嵌入式的Servlet容器傳過去,調(diào)用所有定制器的customize方法,不就是調(diào)用的上面兩種修改配置的重寫后的customize方法嗎,我們?cè)谥貙懞蟮腸ustomize方法中對(duì)參數(shù)進(jìn)行設(shè)置值,就是對(duì)我們這里傳過去的嵌入式Servlet容器設(shè)置值,最終通過全局配置文件中配置和往容器中添加一個(gè)WebServerFactoryCustomizer組件就可以達(dá)到修改嵌入式的Servlet容器的默認(rèn)值了

往容器中添加一個(gè)WebServerFactoryCustomizer組件

前面說(shuō)到的,經(jīng)過一系列的邏輯最終全局配置文件中的值會(huì)在這里給嵌入式的Servlet容器進(jìn)行賦值

注:看完這一篇文章要結(jié)合下一篇文章來(lái)理解

總結(jié)

以上是生活随笔為你收集整理的idea servlet自动配置web.xml_Spring Boot学习04_嵌入式Servlet容器自动配置原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。