日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
詳解SpringBoot底層原理實現

?筆者記得差不多在2015年以前,要部署一個Web應用,那得準備各種Web容器,比如Tomcat,然后打war包,然后部署到Web容器的特定目錄下,以此來完成一個應用的部署,而且應用中的web.xml配置文件是必不可少的??墒墙鼛啄晔褂昧薙pringBoot后,發(fā)現寫一個Web應用真的太簡單了,一個SpringBootApplication注解直接搞定,什么web.xml啥都不用了,干凈利索。

對于SpringBoot,我想99.99%的老鐵都會使用,但是又有幾人知道為什么加了這么一個簡單的注解,一個Web應用就這么輕松的被創(chuàng)建出來了呢?今天筆者就來扒一扒它的神秘面紗。

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

先通過一張圖來說明下SpringBoot啟動的整體流程:

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

1. 自動裝配

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

我們還是從入口入手??梢韵胂?,SpringBoot肯定是需要使用到Spring的核心能力的,而Spring的核心能力就是如何管理Bean的生命周期,那就脫離不了Spring的應用上下文,但是我們在使用SpringBoot的過程中,從頭到尾都沒有明確創(chuàng)建過Spring應用上下文。于是我們有理由相信,一定是在SpringApplication的run方法中創(chuàng)建了這個Spring的應用上下文,而事實上的確如此:

上述代碼中,創(chuàng)建了AnnotationConfigServletWebServerApplicationContext,該類是SpringBoot實現的應用上下文,它是GenericApplicationContext的子類:

很明顯,它具有Spring應用上下文的一切能力。在創(chuàng)建出了Spring應用上下文后,接下來就是去掃描需要被Spring管理的類,得到BeanDefinition信息,然后完成Bean的生命周期管理。

咱們順著SpringBootApplication注解,可以發(fā)現在EnableAutoConfiguration注解上有Import({AutoConfigurationImportSelector.class}的注解信息,Spring會調用AutoConfigurationImportSelector的selectImports方法,將該方法返回的所有字符串對應的類,走Bean的生命周期流程并進行管理:

那么,這個方法返回的字符串數組就是自動裝配的玄機所在,咱們看看它的具體代碼實現就一目了然了:

簡單來說說上述代碼:

順著getCandidateConfigurations方法看:調用loadSpringFactories方法,讀取所有META-INF/spring.factories目錄中的配置信息,返回配置信息中key為EnableAutoConfiguration類型的value值,然后篩選出非exclusions的值,就得到了將要被返回的所有字符串數組的數據。

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

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

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

2. 內置Web容器

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

而EmbeddedTomcat這個類中又通過@Bean注解配置了TomcatServletWebServerFactory:

這個類是用來創(chuàng)建Tomcat的工廠類,它是ServletWebServerFactory接口的實現類:

這表明在Spring應用上下文容器中已經存在了類型為ServletWebServerFactory的Bean,大家記住這個很重要,因為接下來在創(chuàng)建容器的時候就要用到這個Bean。

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

在上面我們說過,SpringBoot會創(chuàng)建一個AnnotationConfigServletWebServerApplicationContext的Spring應用上下文,Spring在執(zhí)行應用上下文的refresh方法時,會執(zhí)行onRefresh方法,來執(zhí)行子上下文的邏輯:

而這個子上下文的onRefresh方法則是執(zhí)行createWebServer方法創(chuàng)建Web服務,也就是咱們所說的Tomcat:

原來如此,這里在createWebServer方法中會從Spring的Bean工廠中獲取到ServletWebServerFactory的實例,而這個實例不就是我們上面提到的TomcatServletWebServerFactory類型的實例嗎?獲取到這個ServletWebServerFactory實例后,調用它的getWebServer方法來創(chuàng)建一個Web服務:

沒錯,就是直接創(chuàng)建一個Tomcat。呵呵,大功告成!

3. 整合SpringMVC

話說,在使用SpringBoot時,寫一個Controller和在SpringMVC中的方法一模一樣,那這個又是怎么做到的呢?

還是看SpringBoot自己提供的spring.factories文件,其中有一個名為DispatcherServletAutoConfiguration的自動配置類,這個類就是那個連接SpringBoot和SpringMVC的橋梁。

我們知道,SpringMVC里面一個核心類就是DispatcherServlet,所以我們完全可以大膽的猜想,在這個自動配置類,一定配置了DispatcherServlet,事實上也確實如此:

有了這個類,一切就水到渠成。

作者介紹

波哥,互聯行業(yè)從業(yè)10余年,先后擔任項目總監(jiān)及架構師。目前專攻技術,喜歡研究技術原理。技術全面,主攻java,精通JVM底層機制及Spring全家桶底層框架原理,熟練掌握當前主流的中間件、服務網格等技術原理。


分享題目:詳解SpringBoot底層原理實現
當前地址:http://www.5511xx.com/article/djsichs.html