javascript
idea servlet自动配置web.xml_Spring Boot学习04_嵌入式Servlet容器自动配置原理
在Spring Boot的自動配置包下,找到web模塊中的servlet文件夾下的ServletWebServerFactoryConfiguration類
一、嵌入式Servlet容器默認的配置原理
1、該類中有三個靜態(tài)內部類(都是配置類):
EmbeddedUndertow、EmbeddedJetty、EmbeddedTomcat
這里拿EmbeddedTomcat來舉例說明
@ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class})
判斷classpath下有沒有Servlet, Tomcat, UpgradeProtocol這三個類,也就是看maven有沒有引入對應的依賴,如果引入了對應的依賴,下面的配置就生效。(上一篇文章SpringBoot切換嵌入式容器就是根據(jù)這里來的鏈接)
2、@ConditionalOnMissingBean(
value = {ServletWebServerFactory.class},
search = SearchStrategy.CURRENT
)
如果容器中沒有ServletWebServerFactory這個組件下面的配置就生效
點進ServletWebServerFactory看,該接口只有一個方法,前面只判斷這個類型的組件有沒有在容器中,而該類型又只有一個方法,說明最終Spring Boot會調用該接口實現(xiàn)類中的getWebServer方法。
3、查看ServletWebServerFactory接口的實現(xiàn),有三個很面熟的實現(xiàn)類,就是上面ServletWebServerFactoryConfiguration類中要往容器中添加的組件
4、進入TomcatServletWebServerFactory類中查看getWebServer方法
首先會創(chuàng)建一個Tomcat對象,給其設置連接器等一些配置
最終還會調用getTomcatWebServer方法
this.getTomcatWebServer(tomcat);
-->return new TomcatWebServer(tomcat, this.getPort() >= 0);
端口號默認是8080所以上面?zhèn)鬟^去的是true,進入TomcatWebServer的構造方法TomcatWebServer中,在構造方法中又調用了this.initialize();進入initialize方法,該方法就會啟動tomcat。(所以這一切都是建立在創(chuàng)建好嵌入式Servlet容器之后)
二、修改SpringBoot初始化嵌入式Servlet容器的默認配置原理
上一篇文章(鏈接)中我們自己配置個WebServerFactoryCustomizer<ConfigurableWebServerFactory>組件就可以實現(xiàn)修改SpringBoot初始化嵌入式Servlet容器的默認配置了,下面開始說怎么修改其默認配置的。
在ServletWebServerFactoryAutoConfiguration類上面有
@EnableConfigurationProperties,@Import注解
1、@EnableConfigurationProperties({ServerProperties.class})
把ServerProperties注冊到容器中,并讀取全局配置文件中的數(shù)據(jù)賦值給類中的屬性。
只有一個有參構造,形參的值(serverProperties)會從容器中獲取,最終交給ServletWebServerFactoryCustomizer類,進入ServletWebServerFactoryCustomizer類
該類也是WebServerFactoryCustomizer的子類
里面有個customize方法會把從容器中獲取到的servlerProperties中的值拿出來然后一個一個的設置給factory,最后交給那個map。
2.1、通過@Import往容器中導入了一個BeanPostProcessorsRegistrar類,該類中的作用是
bean注冊后置處理器:Bean初始化前后(創(chuàng)建好對象,還沒賦值)執(zhí)行初始化工作(容器中某個組件要創(chuàng)建bean,就會驚動后置處理器,容器中要創(chuàng)建bean這個才會觸發(fā),下面的方法才會被調用)
2.2、進入BeanPostProcessorsRegistrar類查看registerBeanDefinitions方法(注冊bean的定義),然后調用registerSyntheticBeanIfMissing方法
2.3、我們點進WebServerFactoryCustomizerBeanPostProcessor類中只需要看postProcessBeforeInitialization方法,在bean創(chuàng)建好之后,初始化之前的調用的方法,該方法首先會判斷當前的bean如果為WebServerFactory類型(我們前面需要往容器中注冊三個嵌入式Servlet容器就是該接口的實現(xiàn)類,所以當前這個bean就是嵌入式的Servlet容器),就調用postProcessBeforeInitialization方法
2.4、進入postProcessBeforeInitialization方法,該方法會獲得所有的定制器,然后遍歷,調用每個定制器的customize方法,并把嵌入式的Servlet容器傳進去。
上一篇文章(鏈接)中我們修改嵌入式的Servlet容器的配置也是往容器中添加一個WebServerFactoryCustomizer組件,并在其customize方法中修改配置。
在前面說到通過配置文件來修改配置也是在WebServerFactoryCustomizer的子類中重寫了
customize方法,并在其customize方法中修改配置。
回到這里的postProcessBeforeInitialization方法,我們這里把嵌入式的Servlet容器傳過去,調用所有定制器的customize方法,不就是調用的上面兩種修改配置的重寫后的customize方法嗎,我們在重寫后的customize方法中對參數(shù)進行設置值,就是對我們這里傳過去的嵌入式Servlet容器設置值,最終通過全局配置文件中配置和往容器中添加一個WebServerFactoryCustomizer組件就可以達到修改嵌入式的Servlet容器的默認值了
往容器中添加一個WebServerFactoryCustomizer組件前面說到的,經過一系列的邏輯最終全局配置文件中的值會在這里給嵌入式的Servlet容器進行賦值注:看完這一篇文章要結合下一篇文章來理解
總結
以上是生活随笔為你收集整理的idea servlet自动配置web.xml_Spring Boot学习04_嵌入式Servlet容器自动配置原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 字段属性命令_mysql
- 下一篇: apt get 安装mysql5.7_u