日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

深入剖析SpringBoot底層原理

來源: 責編: 時間:2023-11-20 17:11:52 233觀看
導讀作者 | 波哥審校 | 重樓記得差不多在2015年以前,要部署一個Web應用,那得準備各種Web容器,比如Tomcat,然后打war包,然后部署到Web容器的特定目錄下,以此來完成一個應用的部署,而且應用中的web.xml配置文件是必不可少的??墒?/div>

作者 | 波哥GfM28資訊網——每日最新資訊28at.com

審校 | 重樓GfM28資訊網——每日最新資訊28at.com

記得差不多在2015年以前,要部署一個Web應用,那得準備各種Web容器,比如Tomcat,然后打war包,然后部署到Web容器的特定目錄下,以此來完成一個應用的部署,而且應用中的web.xml配置文件是必不可少的可是近幾年使用了SpringBoot后,發現寫一個Web應用真的太簡單了,一個SpringBootApplication注解直接搞定,什么web.xml啥都不用了,干凈利索。GfM28資訊網——每日最新資訊28at.com

對于SpringBoot,我想99.99%的老鐵都會使用,但是又有幾人知道為什么加了這么一個簡單的注解,一個Web應用就這么輕松的被創建出來了呢?今天我們就來扒一扒它的神秘面紗。GfM28資訊網——每日最新資訊28at.com

先來說說SpringBoot的幾大核心能力,包括:自動裝配、內置Web容器以及整合SpringMVC,因此筆者本篇主要從上述三個維度來詳細闡述它的底層原理。GfM28資訊網——每日最新資訊28at.com

先通過一張圖來說明下SpringBoot啟動的整體流程:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

我們研究任何源碼,首先得找到它的入口,SpringBoot的入口毫無疑問是SpringApplication.run方法,找到了入口,然后順藤摸瓜看看SpringBoot是如何實現上述的三大核心能力的。GfM28資訊網——每日最新資訊28at.com

1. 自動裝配

那么什么是自動裝配?筆者看來自動裝配就像是搭積木,將多種形狀的模型組裝在一起,對應SpringBoot中的自動裝配則是將單獨的第三方功能,組裝到Spring這個大的容器中,讓Spring可以全權管理所涉及到的Bean實例,并在整個項目中使用。GfM28資訊網——每日最新資訊28at.com

我們還是從入口入手。我們可以想下,SpringBoot肯定是需要使用到Spring的核心能力的,而Spring的核心能力就是如何管理Bean的生命周期,那就肯定脫離不了Spring的應用上下文,但是我們在使用SpringBoot的過程中,從頭到尾都沒有明確創建過Spring應用上下文。于是我們有理由相信,一定是在SpringApplication的run方法中創建了這個Spring的應用上下文,而事實上的確如此:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

上述代碼中,創建了AnnotationConfigServletWebServerApplicationContext,該類是SpringBoot實現的應用上下文,它是GenericApplicationContext的子類:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

很明顯,它具有Spring應用上下文的一切能力。在創建出了Spring應用上下文后,接下來肯定就是去掃描需要被Spring管理的類,得到BeanDefinition信息,然后完成Bean的生命周期管理。關于Bean的生命周期管理,筆者已經寫了系列文章,感興趣的童鞋可以去看看。這里我們只談SpringBoot是如何完成自動裝配的。GfM28資訊網——每日最新資訊28at.com

咱們順著SpringBootApplication注解,可以發現在EnableAutoConfiguration注解上有Import({AutoConfigurationImportSelector.class}的注解信息,Spring會調用AutoConfigurationImportSelector的selectImports方法,將該方法返回的所有字符串對應的類,走Bean的生命周期流程并進行管理:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

那么這個方法返回的字符串數組就是自動裝配的玄機所在,咱們看看它的具體代碼實現就一目了然了:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

簡單來說說上述代碼:

順著getCandidateConfigurations方法看:GfM28資訊網——每日最新資訊28at.com

調用loadSpringFactories方法,讀取所有META-INF/spring.factories目錄中的配置信息,返回配置信息中key為EnableAutoConfiguration類型的value值,然后篩選出非exclusions的值,就得到了將要被返回的所有字符串數組的數據。GfM28資訊網——每日最新資訊28at.com

所以一句話來回答SpringBoot是如何實現自動裝配的呢?

很簡單,Spring就是讀取項目中所有的META-INF/spring.factories配置文件信息,然后加載EnableAutoConfiguration對應的value值。既然Spring已經加載了這些value值到上下文容器中,那就可以使用這些value對應的Bean做為橋梁,來加載更多的其他Bean。GfM28資訊網——每日最新資訊28at.com

如果老鐵們自己實現了一些工具包,也想自動整合進來,也完全可以增加一個META-INF/spring.factories的配置文件作為橋梁來實現,so easy,有木有?GfM28資訊網——每日最新資訊28at.com

2. 內置Web容器

上述Spring已經加載到了EnableAutoConfiguration對應的value值,在SpringBoot自己提供的spring.factories文件中,默認支持了一堆的值,這些都是SpringBoot默認提供的自動裝配類(也可以理解為橋梁類),其中有一個名為:ServletWebServerFactoryAutoConfiguration的配置類,這個配置類中導入了EmbeddedTomcat:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

而EmbeddedTomcat這個類中又通過@Bean注解配置了
TomcatServletWebServerFactory:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

看英文就大概知道了,這個類是用來創建Tomcat的工廠類,它是ServletWebServerFactory接口的實現類:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

這表明在Spring應用上下文容器中已經存在了類型為ServletWebServerFactory的Bean,大家記住這個很重要,因為接下來在創建容器的時候就要用到這個Bean。GfM28資訊網——每日最新資訊28at.com

具體來看看是怎么鏈接的。

在上面我們說過SpringBoot會創建一個AnnotationConfigServletWebServerApplicationContext的Spring應用上下文,Spring在執行應用上下文的refresh方法時,會執行onRefresh方法,來執行子上下文的邏輯:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

而這個子上下文的onRefresh方法則是執行createWebServer方法創建Web服務,也就是咱們所說的Tomcat:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

原來如此,這里在createWebServer方法中會從Spring的Bean工廠中獲取到ServletWebServerFactory的實例,而這個實例不就是我們上面提到的TomcatServletWebServerFactory類型的實例嗎?獲取到這個ServletWebServerFactory實例后,調用它的getWebServer方法來創建一個Web服務:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

沒錯,就是直接創建一個Tomcat。呵呵,大功告成!GfM28資訊網——每日最新資訊28at.com

3. 整合SpringMVC

話說,在使用SpringBoot時,寫一個Controller和在SpringMVC中方法一一樣,那這個又是咋做到的呢?GfM28資訊網——每日最新資訊28at.com

還是看SpringBoot自己提供的spring.factories文件,其中有一個名為DispatcherServletAutoConfiguration的自動配置類,這個類就是那個連接SpringBoot和SpringMVC的橋梁。GfM28資訊網——每日最新資訊28at.com

我們知道,SpringMVC里面一個核心類就是DispatcherServlet,所以我們完全可以大膽的猜想,在這個自動配置類,一定配置了DispatcherServlet,事實上也確實如此:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

有了這個類,一切就水到渠成?不,還沒有渠成,雖然有了這個Bean實例,但是它是如何和Tomcat容器對接上的還沒弄清楚,不是嗎?GfM28資訊網——每日最新資訊28at.com

在上述getWebServer方法中,創建好Tomcat容器后,后面會繼續執行prepareContext方法:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

在該方法中調用configureContext創建TomcatStarter,并且添加到了Tomcat上下文中,而這個TomcatStarter是ServletContainerInitializer的實現類:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

在Servlet3.0的規范里面明確,在Web容器啟動完成后會調用ServletContainerInitializer實現類的onStartup方法,于是就會進入TomcatStarter的onStartup方法:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

該方法中會執行所有ServletContextInitializer類型的onStartup方法,那這個ServletContextInitializer對象是啥?我們在DispatcherServletAutoConfiguration中可以看到配置了DispatcherServletRegistrationBean實例,這個就是ServletContextInitializer的實現類:GfM28資訊網——每日最新資訊28at.com

GfM28資訊網——每日最新資訊28at.com

于是就會調用DispatcherServletRegistrationBean的onStartup方法,從而向Web容器上下文中注冊DispatcherServlet,并配置Mapping映射(默認將“/*”映射到DispatcherServlet)。GfM28資訊網——每日最新資訊28at.com

以上就是SpringBoot的底層原理分析,希望能對老鐵們有所幫助!GfM28資訊網——每日最新資訊28at.com

作者介紹

波哥,互聯行業從業10余年,先后擔任項目總監及架構師。目前專攻技術,喜歡研究技術原理。技術全面,主攻Java,精通JVM底層機制及Spring全家桶底層框架原理,熟練掌握當前主流的中間件、服務網格等技術原理。GfM28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-31547-0.html深入剖析SpringBoot底層原理

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 各類語言真實性能比較列表

下一篇: 面試官:網關如何實現限流?

標簽:
  • 熱門焦點
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • CSS單標簽實現轉轉logo

    轉轉品牌升級后更新了全新的Logo,今天我們用純CSS來實現轉轉的新Logo,為了有一定的挑戰性,這里我們只使用一個標簽實現,將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • 花7萬退貨退款無門:誰在縱容淘寶珠寶商家造假?

    來源:極點商業作者:楊銘在淘寶購買珠寶玉石后,因為保證金不夠賠付,店鋪關閉,退貨退款難、維權無門的比比皆是。“提供相關產品鑒定證書,支持全國復檢,可以30天無理由退換貨。&
  • 東方甄選單飛:有些鳥注定是關不住的

    文/彭寬鴻編輯/羅卿東方甄選創始人俞敏洪帶隊的“7天甘肅行”直播活動已在近日順利收官。成立后一年多時間里,東方甄選要脫離抖音自立門戶的傳聞不絕于耳,“7
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起“馮提莫”這個名字,很多網友或許聽過,但應該不記得她是哪位主播了。其實,作為曾經的“斗魚一姐”,馮提莫在游戲直播的年代影響力不輸于現
  • 三星顯示已開始為AR設備研發硅基LED微顯示屏

    7月18日消息,據外媒報道,隨著蘋果首款頭顯產品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產品也就將成為各大公司下一個重要的競爭領域,對顯示屏這一關
  • 首發天璣9200+ iQOO Neo8系列發布首銷售價2299元起

    2023年5月23日晚,iQOO Neo8系列正式發布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強悍登場,限時售價3099元起;價位段最強性能手機iQOO Neo8同期上市
  • 世界人工智能大會國際日開幕式活動在世博展覽館開啟

    30日上午,世界人工智能大會國際日開幕式活動在世博展覽館開啟,聚集國際城市代表、重量級院士專家、國際創新企業代表,共同打造人工智能交流平臺。上海市副市
Top 主站蜘蛛池模板: 八宿县| 依兰县| 营口市| 邳州市| 保靖县| 中阳县| 富平县| 上犹县| 农安县| 淮阳县| 绥滨县| 梁河县| 华安县| 台南县| 济南市| 云南省| 沁水县| 灵川县| 乃东县| 马公市| 白河县| 山西省| 江口县| 永顺县| 沂南县| 芦山县| 惠来县| 双流县| 项城市| 广德县| 宣化县| 固安县| 秦安县| 汉寿县| 临江市| 陆川县| 洛南县| 普兰店市| 泗水县| 山西省| 松桃|