日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

作者 | 波哥

審校 | 重樓

記得差不多在2015年以前,要部署一個(gè)Web應(yīng)用,那得準(zhǔn)備各種Web容器,比如Tomcat,然后打war包,然后部署到Web容器的特定目錄下,以此來完成一個(gè)應(yīng)用的部署,而且應(yīng)用中的web.xml配置文件是必不可少的。可是近幾年使用了SpringBoot后,發(fā)現(xiàn)寫一個(gè)Web應(yīng)用真的太簡單了,一個(gè)SpringBootApplication注解直接搞定,什么web.xml啥都不用了,干凈利索。

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

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

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

深入剖析SpringBoot底層原理

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

1. 自動裝配

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

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

深入剖析SpringBoot底層原理

深入剖析SpringBoot底層原理

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

深入剖析SpringBoot底層原理

很明顯,它具有Spring應(yīng)用上下文的一切能力。在創(chuàng)建出了Spring應(yīng)用上下文后,接下來肯定就是去掃描需要被Spring管理的類,得到BeanDefinition信息,然后完成Bean的生命周期管理。關(guān)于Bean的生命周期管理,筆者已經(jīng)寫了系列文章,感興趣的童鞋可以去看看。這里我們只談SpringBoot是如何完成自動裝配的。

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

深入剖析SpringBoot底層原理

那么這個(gè)方法返回的字符串?dāng)?shù)組就是自動裝配的玄機(jī)所在,咱們看看它的具體代碼實(shí)現(xiàn)就一目了然了:

深入剖析SpringBoot底層原理

深入剖析SpringBoot底層原理

深入剖析SpringBoot底層原理

簡單來說說上述代碼:

順著getCandidateConfigurations方法看:

調(diào)用loadSpringFactories方法,讀取所有META-INF/spring.factories目錄中的配置信息,返回配置信息中key為EnableAutoConfiguration類型的value值,然后篩選出非exclusions的值,就得到了將要被返回的所有字符串?dāng)?shù)組的數(shù)據(jù)。

所以一句話來回答SpringBoot是如何實(shí)現(xiàn)自動裝配的呢?

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

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

2. 內(nèi)置Web容器

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

深入剖析SpringBoot底層原理

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

深入剖析SpringBoot底層原理

看英文就大概知道了,這個(gè)類是用來創(chuàng)建Tomcat的工廠類,它是ServletWebServerFactory接口的實(shí)現(xiàn)類:

深入剖析SpringBoot底層原理

這表明在Spring應(yīng)用上下文容器中已經(jīng)存在了類型為ServletWebServerFactory的Bean,大家記住這個(gè)很重要,因?yàn)榻酉聛碓趧?chuàng)建容器的時(shí)候就要用到這個(gè)Bean。

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

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

深入剖析SpringBoot底層原理

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

深入剖析SpringBoot底層原理

深入剖析SpringBoot底層原理

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

深入剖析SpringBoot底層原理

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

3. 整合SpringMVC

話說,在使用SpringBoot時(shí),寫一個(gè)Controller和在SpringMVC中方法一模一樣,那這個(gè)又是咋做到的呢?

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

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

深入剖析SpringBoot底層原理

有了這個(gè)類,一切就水到渠成?不,還沒有渠成,雖然有了這個(gè)Bean實(shí)例,但是它是如何和Tomcat容器對接上的還沒弄清楚,不是嗎?

在上述getWebServer方法中,創(chuàng)建好Tomcat容器后,后面會繼續(xù)執(zhí)行prepareContext方法:

深入剖析SpringBoot底層原理

深入剖析SpringBoot底層原理

在該方法中調(diào)用configureContext創(chuàng)建TomcatStarter,并且添加到了Tomcat上下文中,而這個(gè)TomcatStarter是ServletContAInerInitializer的實(shí)現(xiàn)類:

深入剖析SpringBoot底層原理

在Servlet3.0的規(guī)范里面明確,在Web容器啟動完成后會調(diào)用ServletContainerInitializer實(shí)現(xiàn)類的onStartup方法,于是就會進(jìn)入TomcatStarter的onStartup方法:

深入剖析SpringBoot底層原理

該方法中會執(zhí)行所有ServletContextInitializer類型的onStartup方法,那這個(gè)ServletContextInitializer對象是啥?我們在DispatcherServletAutoConfiguration中可以看到配置了DispatcherServletRegistrationBean實(shí)例,這個(gè)就是ServletContextInitializer的實(shí)現(xiàn)類:

深入剖析SpringBoot底層原理

于是就會調(diào)用DispatcherServletRegistrationBean的onStartup方法,從而向Web容器上下文中注冊DispatcherServlet,并配置Mapping映射(默認(rèn)將“/*”映射到DispatcherServlet)。

以上就是SpringBoot的底層原理分析,希望能對老鐵們有所幫助!

作者介紹

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

分享到:
標(biāo)簽:SpringBoot
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定