免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

【Spring boot】整合tomcat底層原理

本文結(jié)論

  • 源碼基于spring boot2.6.6
  • 項目的pom.xml中存在spring-boot-starter-web的時候,在項目啟動時候就會自動啟動一個Tomcat 。
  • 自動配置類ServletWebServerFactoryAutoConfiguration找到系統(tǒng)中的所有web容器 。我們以tomcat為主 。
  • 構(gòu)建TomcatServletWebServerFactory的bean 。
  • SpringBoot的啟動過程中,會調(diào)用核心的refresh方法,內(nèi)部會執(zhí)行onRefresh()方法,onRefresh()方法是一個模板方法,他會執(zhí)行會執(zhí)行子類ServletWebServerApplicationContext的onRefresh()方法 。
  • onRefresh()方法中調(diào)用getWebServer啟動web容器 。
spring-boot-starter-web內(nèi)部有什么?
  • 在spring-boot-starter-web這個starter中,其實內(nèi)部間接的引入了spring-boot-starter-tomcat這個starter,這個spring-boot-starter-tomcat又引入了tomcat-embed-core依賴,所以只要我們項目中依賴了spring-boot-starter-web就相當于依賴了Tomcat 。

【Spring boot】整合tomcat底層原理

文章插圖

【Spring boot】整合tomcat底層原理

文章插圖
自動配置類:ServletWebServerFactoryAutoConfiguration
  • 在spring-boot-autoconfigure-2.6.6.jar這個包中的spring.factories文件內(nèi),配置了大量的自動配置類,其中就包括自動配置tomcat的自動配置類:ServletWebServerFactoryAutoConfiguration

【Spring boot】整合tomcat底層原理

文章插圖
自動配置類的代碼如下// full模式@Configuration(proxyBeanMethods = false)// 配置類解析順序@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)// 條件注解:表示項目依賴中要有ServletRequest類(server api)@ConditionalOnClass(ServletRequest.class)// 表示項目應用類型得是SpringMVC(在啟動過程中獲取的SpringBoot應用類型)@ConditionalOnWebApplication(type = Type.SERVLET)// 讀取server下的配置文件@EnableConfigurationProperties(ServerProperties.class)// import具體的加載配置的類和具體web實現(xiàn)容器@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,ServletWebServerFactoryConfiguration.EmbeddedJetty.class,ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })public class ServletWebServerFactoryAutoConfiguration { ......}
  • ServletRequest是存在于tomcat-embed-core-9.0.60.jar中的的一個類,所以@ConditionalOnClass(ServletRequest.clas s)會滿足 。
  • spring-boot-starter-web中,間接的引入了spring-web、spring-webmvc等依賴,所以@ConditionalOnWebApplication(type = Type.SERVLET)條件滿足 。
  • 上面的倆個條件都滿足,所以spring回去解析這個配置類,在解析過程中會發(fā)現(xiàn)他import了三個類!我們重點關(guān)注EmbeddedTomcat 。其他倆個的內(nèi)部條件注解不滿足!
@Configuration(proxyBeanMethods = false)// tomcat內(nèi)部的類,肯定都存在@ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class })// 程序員如果自定義了ServletWebServerFactory的Bean,那么這個Bean就不加載 。@ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)static class EmbeddedTomcat {    @Bean    TomcatServletWebServerFactory tomcatServletWebServerFactory(        ObjectProvider<TomcatConnectorCustomizer> connectorCustomizers,        ObjectProvider<TomcatContextCustomizer> contextCustomizers,        ObjectProvider<TomcatProtocolHandlerCustomizer<?>> protocolHandlerCustomizers) {            TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();            // orderedStream()調(diào)用時會去Spring容器中找到TomcatConnectorCustomizer類型的Bean,默認是沒有的,程序員可以自己定義 。這個Bean可以設(shè)置一些tomcat的配置,比如端口、協(xié)議...            // TomcatConnectorCustomizer:是用來配置Tomcat中的Connector組件的            factory.getTomcatConnectorCustomizers().addAll(connectorCustomizers.orderedStream().collect(Collectors.toList()));            // TomcatContextCustomizer:是用來配置Tomcat中的Context組件的            factory.getTomcatContextCustomizers().addAll(contextCustomizers.orderedStream().collect(Collectors.toList()));            // TomcatProtocolHandlerCustomizer:是用來配置Tomcat中的ProtocolHandler組件的            factory.getTomcatProtocolHandlerCustomizers().addAll(protocolHandlerCustomizers.orderedStream().collect(Collectors.toList()));            return factory;        }    }}

經(jīng)驗總結(jié)擴展閱讀