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

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

深入剖析SpringBoot底層原理

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

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

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

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

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

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

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

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

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

1. 自動裝配

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

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

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

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

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

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

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

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

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

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

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

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

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

簡單來說說上述代碼:

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

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

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

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

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

2. 內置Web容器

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. 整合SpringMVC

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

作者介紹

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

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

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

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

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

標簽:
  • 熱門焦點
  • 印度登月最關鍵一步!月船三號今晚進入環月軌道

    8月5日消息,據印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業務來說可快速實現自動化的上手工作。Selenium IDEKat
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力。  CRM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規模如今超過580
  • 重估百度丨“晚熟”的百度云,能等到春天嗎?

    ©自象限原創作者|程心排版|王喻可2016年7月13日,百度云計算戰略發布會在北京舉行,宣告著百度智能云的正式啟程。彼時的會場座無虛席,甚至排隊排到了門外,在場的所有人幾乎都
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 東方甄選單飛:有些鳥注定是關不住的

    作者:彭寬鴻來源:華爾街科技眼‍‍‍‍‍‍‍‍‍‍東方甄選創始人俞敏洪帶隊的“7天甘肅行”直播活動已在近日順利收官。成立后一
  • 到手價3099元起!iQOO Neo8 Pro今日首銷:安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
  • OPPO K11評測:旗艦級IMX890加持 2000元檔最強影像手機

    【Techweb評測】中端機型用戶群體巨大,占了中國目前手機市場的大頭,一直以來都是各手機品牌的“必爭之地”,其中OPPO K系列機型一直以來都以高品質、
  • 電博會上海爾智家模擬500平大平層,還原生活空間沉浸式體驗

    電博會為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗。程傳
Top 主站蜘蛛池模板: 普兰店市| 和硕县| 鄂温| 大宁县| 平塘县| 荣昌县| 石柱| 贵州省| 青州市| 酒泉市| 从化市| 石狮市| 清镇市| 乌鲁木齐县| 临沧市| 射洪县| 湄潭县| 丽水市| 无棣县| 莒南县| 海丰县| 白朗县| 新营市| 三河市| 忻州市| 镇平县| 松江区| 苏尼特左旗| 濉溪县| 湘潭市| 汤原县| 弥勒县| 项城市| 遵化市| 游戏| 晋江市| 舟曲县| 绥中县| 台东县| 康平县| 长沙县|