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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot 嵌入式Servlet容器

發布時間:2025/3/15 javascript 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot 嵌入式Servlet容器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、嵌入式Servlet容器

  • 切換嵌入式Servlet容器
    • 默認支持的webServer :Tomcat, Jetty, or Undertow
    • ServletWebServerApplicationContext 容器啟動尋找ServletWebServerFactory并引導創建服務器

    切換服務器

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!--排除默認導入的tomcat--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions> </dependency>
  • 原理
    我們知道Springboot的自動配置都是通過一些AutoConfiguration類進行自動配置的,所以同理本博客也找一些對應的類,ServletWebServerFactoryAutoConfiguration 就是嵌入式servlet容器的自動配置類,簡單跟一下其源碼:
  • @Configuration(proxyBeanMethods = false) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnClass(ServletRequest.class) @ConditionalOnWebApplication(type = Type.SERVLET) @EnableConfigurationProperties(ServerProperties.class)//使ServerProperties配置類起效 @Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,ServletWebServerFactoryConfiguration.EmbeddedJetty.class,ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })//@Import是Spring框架的注解,作用是將對應組件加載到容器,這里關鍵的是BeanPostProcessorsRegistrar,一個后置處理類 public class ServletWebServerFactoryAutoConfiguration {@Beanpublic ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties) {return new ServletWebServerFactoryCustomizer(serverProperties);}//Tomcat的定制器類,起作用的條件是有Tomcat對應jar有引入項目的情況,默認是引入的,所以會執行Tomcat的servletWeb工廠定制類@Bean@ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(ServerProperties serverProperties) {return new TomcatServletWebServerFactoryCustomizer(serverProperties);}....//注冊重要的后置處理器類WebServerFactoryCustomizerBeanPostProcessor,在ioc容器啟動的時候會調用后置處理器public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {private ConfigurableListableBeanFactory beanFactory;//設置ConfigurableListableBeanFactory@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {if (beanFactory instanceof ConfigurableListableBeanFactory) {this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;}}@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {if (this.beanFactory == null) {return;}registerSyntheticBeanIfMissing(registry, "webServerFactoryCustomizerBeanPostProcessor",WebServerFactoryCustomizerBeanPostProcessor.class);registerSyntheticBeanIfMissing(registry, "errorPageRegistrarBeanPostProcessor",ErrorPageRegistrarBeanPostProcessor.class);}private void registerSyntheticBeanIfMissing(BeanDefinitionRegistry registry, String name, Class<?> beanClass) {if (ObjectUtils.isEmpty(this.beanFactory.getBeanNamesForType(beanClass, true, false))) {RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);beanDefinition.setSynthetic(true);registry.registerBeanDefinition(name, beanDefinition);}}}}

    從自動配置類里,我們并不能很明確地理解自動配置是怎么運行的,只看重關鍵的一些信息點,比如注冊了Tomcat的ServletWebServer工廠的定制器類,方法是tomcatServletWebServerFactoryCustomizer,還有一個后置處理類BeanPostProcessorsRegistrar,后置處理是Spring源碼里是很關鍵的,所以這里可以繼續點一下TomcatServletWebServerFactoryCustomizer,Tomcat的webServer工廠定制器類

    也是一個WebServerFactoryCustomizer類型的類,這個類是進行servlet容器的一些定制

    這個是關鍵的方法,主要是拿ServerProperties配置類里的信息進行特定屬性定制

    所以,這里就可以知道Tomcat的配置是通過定制器類TomcatServletWebServerFactoryCustomizer進行定制的,其工廠類是TomcatServletWebServerFactory

    TomcatServletWebServerFactory工廠類進行Tomcat對象的創建,必要參數的自動配置

    ok,簡單跟了一下源碼之后,我們知道了TomcatServletWebServerFactoryCustomizer是Tomcat的定制器類,Tomcat對象的創建是通過TomcatServletWebServerFactory類的,然后,有個疑問,這個定制器類是什么時候創建的?為什么一啟動Application類,嵌入式的Tomcat也啟動了?打成jar格式的Springboot項目,只要運行jar命令,不需要啟動任何servlet容器,項目也是正常運行的?然后這個BeanPostProcessorsRegistrar后置處理類有什么作用?ok,帶著這些疑問,我們還是用調試一下源碼

    如圖,打斷點調試,看看Tomcat定制器是怎么創建的?

    定制器類被調用了,其對應的工廠類也會起作用,打個斷點,看看工廠類是怎么調用的?

    ok,啟動Application類,在idea里調試,如圖,可以跟著調用順序,一點點跟源碼,如圖所示,調用了Springboot的run方法

    run方法里的刷新上下文方法,refreshContext其實也就是創建ioc容器,初始化ioc容器,并創建容器的每一個組件

    這里注意到了,調用到了ServletWebServerApplicationContext類的refresh方法,ServletWebServerApplicationContext類前面也介紹到了,這個類是一種特殊的ApplicationContext類,也就是一些ioc的上下文類,作用于WebServer類型的類

    創建webServer類,先創建ioc容器,調用基類的onRefresh方法,然后再調用createWebServer方法

    ioc的servletContext組件沒被創建的情況,調用ServletWebServerFactory類獲取WebServer類,有servletContext的情況,直接從ioc容器獲取

    掃描ioc容器里是否有對應的ServletWebServerFactory類,TomcatServletWebServerFactory是其中一種,通過調試,是有掃描到的,所以從ioc容器里將這個bean對應的信息封裝到ServletWebServerFactory對象

    接著是ioc容器創建bean的過程,這個一個比較復雜的過程,因為是單例的,所以是調用singleObjects進行存儲

    bean被創建之后,調用了后置處理器,這個其實就是Spring的源碼里的bean的創建過程,后置處理器是很關鍵的,在bean被創建,還沒進行屬性賦值時候,就調用了后置處理器

    關鍵點,這里是檢測是否有WebServerFactory工廠類,前面的調試發現已經有Tomcat的WebServer工廠類,所以是會調用后置處理器的

    調用了WebServerFactoryCustomizerBeanPostProcessor這個后置處理類,然后拿到一個WebServerFactoryCustomizer定制器類,也就是TomcatWebServerFactoryCustomizer,通過后置處理器調用定制方法customize

    然后WebServerFactoryCustomizerBeanPostProcessor這個后置處理器是什么注冊的?往前翻Springboot的自動配置類,在這里找到了WebServerFactoryCustomizerBeanPostProcessor的注冊

    ok,繼續調試源碼,BeanWrapperImpl創建bean實例

    ok,Tomcat定制器類被調用了,是通過后置處理器調用的

    然后就是之前跟過的定制方法customize執行:

    Tomcat的WebServer工廠類創建Tomcat對象實例,進行屬性配置,引擎設置等等

    端口有設置就創建TomcatwebServer對象

    TomcatWebServer啟動Tomcat,如圖代碼所示:

    ok,跟了源碼,您是否有一個疑問?Tomcat的工廠類TomcatServletWebServerFactory是什么時候創建的?好的,返回前面配置類看看,如圖,這里用import引入了EmbeddedTomcat類

    ok,EmbeddedTomcat是一個內部的配置類,條件是有引入Tomcat對應的jar,就會自動創建工廠類,很顯然,Springboot默認是有引入的

    ok,經過源碼比較簡單的學習,思路就很清晰了,Springboot的ServletWebServerFactoryAutoConfiguration是嵌入式Servlet容器的自動配置類,這個類的主要作用是創建TomcatServletWebServerFactory工廠類,創建定制器類TomcatServletWebServerFactoryCustomizer,創建FilterRegistrationBean類,同時很關鍵的一步是注冊后置處理器webServerFactoryCustomizerBeanPostProcessor,然后Springboot的Application類一啟動,就會執行run方法,run經過一系列調用會通過ServletWebServerApplicationContext的onRefresh方法創建ioc容器,然后通過createWebServer方法,createWebServer方法會去ioc容器里掃描是否有對應的ServletWebServerFactory工廠類(TomcatServletWebServerFactory是其中一種),掃描得到,就會觸發webServerFactoryCustomizerBeanPostProcessor后置處理器類,這個處理器類會獲取TomcatServletWebServerFactoryCustomizer定制器,并調用customize方法進行定制,這時候工廠類起作用,調用getWebServer方法進行Tomcat屬性配置和引擎設置等等,再創建TomcatWebServer啟動Tomcat容器,ok,本博客只是簡單跟一下嵌入式Tomcat容器的啟動過程,可以看出Springboot的強大,還是基于Spring框架的,比如本文提到的后置處理器,以及bean工程創建bean實例的過程,都是通過Spring框架實現的。

    二、總結

  • SpringBoot應用啟動發現當前是Web應用。web場景包-導入tomcat
  • web應用會創建一個web版的ioc容器 ServletWebServerApplicationContext
  • ServletWebServerApplicationContext 啟動的時候尋找 ServletWebServerFactory(Servlet 的web服務器工廠—> Servlet 的web服務器)
  • SpringBoot底層默認有很多的WebServer工廠;TomcatServletWebServerFactory, JettyServletWebServerFactory, or UndertowServletWebServerFactory
  • 底層直接會有一個自動配置類。ServletWebServerFactoryAutoConfiguration
  • ServletWebServerFactoryAutoConfiguration導入了ServletWebServerFactoryConfiguration(配置類)
  • ServletWebServerFactoryConfiguration 配置類 根據動態判斷系統中到底導入了那個Web服務器的包。(默認是web-starter導入tomcat包),容器中就有 TomcatServletWebServerFactory
  • TomcatServletWebServerFactory 創建出Tomcat服務器并啟動;TomcatWebServer 的構造器擁有初始化方法initialize—this.tomcat.start();
  • 內嵌服務器,就是手動把啟動服務器的代碼調用(tomcat核心jar包存在)
  • 三、定制Servlet容器

  • 實現 WebServerFactoryCustomizer
    • 把配置文件的值和ServletWebServerFactory 進行綁定
  • 修改配置文件 server.xxx

  • 直接自定義 ConfigurableServletWebServerFactory

  • xxxxxCustomizer:定制化器,可以改變xxxx的默認規則

    import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.stereotype.Component; @Component public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {@Overridepublic void customize(ConfigurableServletWebServerFactory server) {server.setPort(9000);} }

    部分轉自

    總結

    以上是生活随笔為你收集整理的SpringBoot 嵌入式Servlet容器的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 久久久久久久国产精品毛片 | 日韩av在线影院 | 综合在线亚洲 | 538国产精品一区二区免费视频 | 极品一区 | 色999在线 | 午夜激情在线观看 | 国产在线视频自拍 | 欧美男女交配视频 | 欧美在线视频你懂的 | 亚洲男人天堂 | 好av在线| 久久精品欧美日韩 | 天天射网站 | 欧洲三级视频 | 99在线视频免费观看 | 中文字幕乱码人妻二区三区 | 99精品偷自拍 | 九七在线视频 | 3d欧美精品动漫xxxx无尽 | 精品人妻伦一二三区久久 | 欧美日韩图片 | 国产一极毛片 | 波多野结衣视频观看 | 法国空姐在线观看视频 | 亚洲成人第一 | 91丨porny丨对白 | 在线免费观看一区二区三区 | 中文字幕在线观看网站 | 免费拍拍拍网站 | 一级毛片黄色 | 午夜日韩在线观看 | 久久久久久国产精品三区 | 三级性生活视频 | 免费激情 | 黄色a视频 | 久操视频在线免费观看 | 国产极品美女高潮无套嗷嗷叫酒店 | 五月婷婷免费视频 | 超碰在线资源 | 波多野结衣黄色 | 熟女丝袜一区 | 噼里啪啦国语版在线观看 | 天天操人人射 | 国产在线观看中文字幕 | av免费黄色| 韩日av片 | 97在线精品视频 | 男生和女生差差的视频 | a√在线 | 日韩综合 | 国产黄a三级 | 久久精品视频免费观看 | 国产成人精品视频在线观看 | 成人里番精品一区二区 | 一区二区不卡在线 | 国产国语性生话播放 | 一本一道人人妻人人妻αv 九一在线视频 | 成人公开视频 | 久操免费在线视频 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 欧美日韩三级在线 | 成人a视频在线观看 | 日韩亚洲欧美精品 | www日本在线观看 | 一区二区三区中文字幕在线观看 | 人妻少妇偷人精品视频 | 国产色呦呦 | 国产日韩一区二区三免费高清 | 国产高清在线观看 | 毛片的网站 | 三级免费黄 | 伊人色爱| 一区二区三区视频免费观看 | 最新国产露脸在线观看 | 国产免费久久 | 国内自拍网站 | 日本一区二区在线不卡 | 精品国产一区二 | 国产网友自拍视频 | 肌肉猛男裸体gay网站免费 | 色多多视频在线观看 | 国产伦精品一区二区三区视频1 | 久久国产二区 | 裸体女视频| 四虎亚洲精品 | 国产愉拍 | 一本久久道 | 日本精品一区二区三区四区 | 天天爱天天草 | 男女免费观看视频 | 捆绑中国女人hd视频 | 欧美激精品 | www.jizzcom| 性色av无码久久一区二区三区 | 337p嫩模大胆色肉噜噜噜 | 少妇喷潮明星 | 两性囗交做爰视频 | 在线观看麻豆视频 |