by shihang.mai
1. 啟動(dòng)流程圖
查看springboot2.3.7源碼后繪制下圖。

- 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ì)象返回
- run()。主要?jiǎng)?chuàng)建了環(huán)境(environment)、事件監(jiān)聽(listeners)、應(yīng)用上下文(applicationContext),并基于以上條件,在容器中開始實(shí)例化我們需要的Bean(refresh方法實(shí)例化bean)
- 其中執(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í)
- @SpringBootApplication注解包含了很多注解,這里會(huì)解析該注解,將注解中的@Import包含的類注入
- @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)裝配的類
- 而這些需要自動(dòng)裝配的類,通過BFPP(ConfigurationClassPostProcessor)對(duì)它們的注解進(jìn)行解析,變?yōu)锽eanDefinition.
- 有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)變化如下圖

4. 總結(jié)
事件監(jiān)聽器的加載依賴spring.factoires文件對(duì)應(yīng)的類
自動(dòng)裝配利用了SpringFactoriesLoader來加載META-INF/spring.factoires文件里所有配置的EnableAutoConfgruation,它會(huì)經(jīng)過exclude和filter等操作,最終確定要裝配的類
處理@Configuration的核心還是ConfigurationClassPostProcessor,這個(gè)類實(shí)現(xiàn)了BeanFactoryPostProcessor, 因此當(dāng)AbstractApplicationContext執(zhí)行refresh方法里的invokeBeanFactoryPostProcessors(beanFactory)方法時(shí)會(huì)執(zhí)行自動(dòng)裝配
內(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才是大哥