springboot-啟動(dòng)流程

by shihang.mai

1. 啟動(dòng)流程圖

查看springboot2.3.7源碼后繪制下圖。

springboot啟動(dòng)流程圖
  1. main啟動(dòng),new SpringApplication()構(gòu)造方法里面
  • 判斷當(dāng)前應(yīng)用程序類型reactive、servlet、none
  • 獲取所有的ApplicationListener對(duì)應(yīng)的對(duì)象
  • 獲取所有的ApplicationContextInitializer對(duì)應(yīng)的對(duì)象
    獲取的方式:通過傳入類名,從spring.factories文件獲得所有對(duì)應(yīng)類的全路徑,反射得到所有的實(shí)例對(duì)象返回
  1. run()。主要?jiǎng)?chuàng)建了環(huán)境(environment)、事件監(jiān)聽(listeners)、應(yīng)用上下文(applicationContext),并基于以上條件,在容器中開始實(shí)例化我們需要的Bean(refresh方法實(shí)例化bean)
  2. 其中執(zhí)行BeanFactoryPostProcessors. invokeBeanFactoryPostProcessors()時(shí)做了自動(dòng)裝配流程
  • 遞歸獲取@SpringBootApplication包含的@Import的類,其中AutoConfigurationImportSelector是自動(dòng)狀態(tài)的核心
  • 在這個(gè)類里面,獲取spring.factories中key=org.springframework.boot.autoconfigure.EnableAutoConfiguration所有的自動(dòng)裝配類,再經(jīng)過過濾得到當(dāng)前應(yīng)用需要加載的類.容器啟動(dòng)類ServletWebServerFactoryAutoConfiguration也在這里獲取

2. 自動(dòng)裝配

如上圖所示中的第11步,其中在執(zhí)行BeanFactoryPostProcessors時(shí)

  1. @SpringBootApplication注解包含了很多注解,這里會(huì)解析該注解,將注解中的@Import包含的類注入
  2. @Import注入了類AutoConfigurationImportSelector,這個(gè)類用于發(fā)現(xiàn)spring.factories文件中key=org.springframework.boot.autoconfigure.EnableAutoConfiguration對(duì)應(yīng)的全量需要自動(dòng)裝配的類。然后經(jīng)過過濾,找到當(dāng)前應(yīng)用需要自動(dòng)裝配的類
  3. 而這些需要自動(dòng)裝配的類,通過BFPP(ConfigurationClassPostProcessor)對(duì)它們的注解進(jìn)行解析,變?yōu)锽eanDefinition.
  4. 有BeanDefinition之后,走spring的bean生成流程

3. 內(nèi)嵌tomcat啟動(dòng)

經(jīng)過自動(dòng)裝配邏輯,那么會(huì)得到WebServer關(guān)鍵類ServletWebServerFactoryAutoConfiguration

在第11步onRefresh()方法中,獲取WebServer中,默認(rèn)是Tomcat,其中Tomcat包含幾個(gè)組件

  • Server
  • Service
  • Engine
  • Connector

在創(chuàng)建Tomcat時(shí)會(huì)利用關(guān)鍵類LifecycleBase,最一個(gè)流程模版,流程是

總流程: init()->start()
流程拆分init(): setStateInternal()->initInternal()->setStateInternal()
流程拆分start(): setStateInternal()->startInternal()->setStateInternal()

流程中各組件的生命周期狀態(tài)變化如下圖

springboot的tomcat組件生命周期

4. 總結(jié)

  1. 事件監(jiān)聽器的加載依賴spring.factoires文件對(duì)應(yīng)的類

  2. 自動(dòng)裝配利用了SpringFactoriesLoader來加載META-INF/spring.factoires文件里所有配置的EnableAutoConfgruation,它會(huì)經(jīng)過exclude和filter等操作,最終確定要裝配的類

  3. 處理@Configuration的核心還是ConfigurationClassPostProcessor,這個(gè)類實(shí)現(xiàn)了BeanFactoryPostProcessor, 因此當(dāng)AbstractApplicationContext執(zhí)行refresh方法里的invokeBeanFactoryPostProcessors(beanFactory)方法時(shí)會(huì)執(zhí)行自動(dòng)裝配

  4. 內(nèi)嵌Tomcat啟動(dòng),首先依賴自動(dòng)裝配,然后組裝Tomcat各組件,啟動(dòng)Tomcat

5. spring Springboot springCloud

spring是框架,是一套生態(tài),它的擴(kuò)展性,有定義了很多接口,由用戶自行去實(shí)現(xiàn)方法,可以使程序更快更安全更容易。spring核心IOC和AOP。spring簡化開發(fā),降低開發(fā)復(fù)雜度,輕量級(jí)注入pojo,通過IOC,依賴注入和面向接口實(shí)現(xiàn)松耦合,基于AOP聲明式編程,面向切面減少樣式代碼。
spring核心IOC和AOP,spring簡化開發(fā),降低開發(fā)復(fù)雜度

springboot為所有spring開發(fā)者更快入門。開箱即用,提供各種默認(rèn)配置來簡化項(xiàng)目配置。內(nèi)嵌式容器簡化web項(xiàng)目。沒有冗余代碼生成和xml配置的要求。
springboot構(gòu)建為主,快速啟動(dòng)項(xiàng)目

大型分布式網(wǎng)絡(luò)服務(wù)調(diào)用,由springcloud完成,實(shí)現(xiàn)分布式。代表著spring的生態(tài)。springcloud可以幫助服務(wù)之間的發(fā)現(xiàn)調(diào)用,負(fù)載均衡,熔斷,監(jiān)控,分布式通信等,提供一系列API網(wǎng)關(guān)。springcloud依賴springboot。springcloud基于http協(xié)議有利于異構(gòu)平臺(tái),跨語言;可插拔,基于Rest協(xié)議,服務(wù)之間調(diào)用是弱關(guān)聯(lián),例如A調(diào)B,并非每次都一定是那個(gè)具體的B的服務(wù),無狀態(tài)的服務(wù),并非像長連接,sprincloud輕量級(jí);網(wǎng)絡(luò)不可靠,例如eureka,開啟自我保護(hù)模式在網(wǎng)絡(luò)抖動(dòng)時(shí)??捎眯蕴岣呱晕⒔档涂煽啃?。
springcloud協(xié)調(diào)為主

spring為我們由整個(gè)從項(xiàng)目構(gòu)建應(yīng)用到大型分布式應(yīng)用全流程都指定了一系列全方案。spring全家桶。

SpringCloud依賴Springboot,Springboot依賴Spring,Spring才是大哥

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容