日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

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

一、嵌入式Servlet容器默認的配置原理

1、該類中有三個靜態內部類(都是配置類):

EmbeddedUndertow、EmbeddedJetty、EmbeddedTomcat

這里拿EmbeddedTomcat來舉例說明

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

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

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

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

點進ServletWebServerFactory看,該接口只有一個方法,前面只判斷這個類型的組件有沒有在容器中,而該類型又只有一個方法,說明最終Spring Boot會調用該接口實現類中的getWebServer方法。

3、查看ServletWebServerFactory接口的實現,有三個很面熟的實現類,就是上面ServletWebServerFactoryConfiguration類中要往容器中添加的組件

4、進入TomcatServletWebServerFactory類中查看getWebServer方法

首先會創建一個Tomcat對象,給其設置連接器等一些配置

最終還會調用getTomcatWebServer方法

this.getTomcatWebServer(tomcat);

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

端口號默認是8080所以上面傳過去的是true,進入TomcatWebServer的構造方法TomcatWebServer中,在構造方法中又調用了this.initialize();進入initialize方法,該方法就會啟動tomcat。(所以這一切都是建立在創建好嵌入式Servlet容器之后)


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

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

在ServletWebServerFactoryAutoConfiguration類上面有

@EnableConfigurationProperties,@Import注解

1、@EnableConfigurationProperties({ServerProperties.class})

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

只有一個有參構造,形參的值(serverProperties)會從容器中獲取,最終交給ServletWebServerFactoryCustomizer類,進入ServletWebServerFactoryCustomizer類

該類也是WebServerFactoryCustomizer的子類

里面有個customize方法會把從容器中獲取到的servlerProperties中的值拿出來然后一個一個的設置給factory,最后交給那個map。

2.1、通過@Import往容器中導入了一個BeanPostProcessorsRegistrar類,該類中的作用是

bean注冊后置處理器:Bean初始化前后(創建好對象,還沒賦值)執行初始化工作(容器中某個組件要創建bean,就會驚動后置處理器,容器中要創建bean這個才會觸發,下面的方法才會被調用)

2.2、進入BeanPostProcessorsRegistrar類查看registerBeanDefinitions方法(注冊bean的定義),然后調用registerSyntheticBeanIfMissing方法

2.3、我們點進WebServerFactoryCustomizerBeanPostProcessor類中只需要看postProcessBeforeInitialization方法,在bean創建好之后,初始化之前的調用的方法,該方法首先會判斷當前的bean如果為WebServerFactory類型(我們前面需要往容器中注冊三個嵌入式Servlet容器就是該接口的實現類,所以當前這個bean就是嵌入式的Servlet容器),就調用postProcessBeforeInitialization方法

2.4、進入postProcessBeforeInitialization方法,該方法會獲得所有的定制器,然后遍歷,調用每個定制器的customize方法,并把嵌入式的Servlet容器傳進去。

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

在前面說到通過配置文件來修改配置也是在WebServerFactoryCustomizer的子類中重寫了

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

回到這里的postProcessBeforeInitialization方法,我們這里把嵌入式的Servlet容器傳過去,調用所有定制器的customize方法,不就是調用的上面兩種修改配置的重寫后的customize方法嗎,我們在重寫后的customize方法中對參數進行設置值,就是對我們這里傳過去的嵌入式Servlet容器設置值,最終通過全局配置文件中配置和往容器中添加一個WebServerFactoryCustomizer組件就可以達到修改嵌入式的Servlet容器的默認值了

往容器中添加一個WebServerFactoryCustomizer組件

前面說到的,經過一系列的邏輯最終全局配置文件中的值會在這里給嵌入式的Servlet容器進行賦值

注:看完這一篇文章要結合下一篇文章來理解

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。