Springboot 項(xiàng)目的整個(gè)啟動(dòng)流程
要從注解講起否則就是耍流氓
@SpringBootApplication注解
?講解:該注解是一個(gè)復(fù)合注解,它由三個(gè)注解組成。
? ? ? ? ? ??①@SpringBootConfiguration(打開是@Configuration):表明這是一個(gè)java配置類
? ? ? ? ? ? ②@EnableAutoConfiguration:自動(dòng)配置注解,會將所有符合自動(dòng)配置條件的@Configuration配置加載到IOC容器中。
? ? ? ? ? ??③@ComponentScan:掃描注解,自動(dòng)掃描符合條件的組件 (@Service,@Component)或者bean定義,記載到IOC容器中
?springBoot的啟動(dòng)流程
從spring.factories配置文件中加載EventPublishingRunListener對象,該對象擁有SimpleApplicationEventMulticaster屬性,即在springboot啟動(dòng)過程的不同階段用來發(fā)射內(nèi)置的生命周期事件。
準(zhǔn)備環(huán)境變量,包括系統(tǒng)變量,環(huán)境變量,命令行參數(shù),默認(rèn)變量,servlet相關(guān)配置變量,隨機(jī)值及配置文件(比如application.properties)等
控制臺打印springboot的bannner標(biāo)志
根據(jù)不同類型環(huán)境創(chuàng)建不同類型的applicationcontext容器,如果是servlet環(huán)境,創(chuàng)建的就是AnnotationConfigServletWebServerApplicatonContext容器對象
從spring.factories配置文件中加載FailureAnalyZers對象,用來報(bào)告springboot啟動(dòng)過程中的異常
為剛創(chuàng)建的容器對象做一些初始化工作,準(zhǔn)備一些容器屬性值等,對ApplicationContext應(yīng)用一些相關(guān)的后置處理和調(diào)用各個(gè)ApplicationContextInitializer的初始化方法來執(zhí)行一些初始邏輯等
刷新容器,這一步至關(guān)重要。比如調(diào)用bean factory的后置處理器,注冊BeanPostProcessor后置處理器,初始化事件廣播器且廣播事件,初始化剩下的單例bean和springboot創(chuàng)建內(nèi)嵌的Tomcat服務(wù)器等重要且復(fù)雜的邏輯都在這里實(shí)現(xiàn)
執(zhí)行刷新新容器后的后置處理邏輯,注意這里為空方法
調(diào)用ApplicationRunner和CommandLineRunner的run方法,我們實(shí)現(xiàn)這兩個(gè)接口可以在spring容器啟動(dòng)后需要的一些東西 比如加載一些業(yè)務(wù)數(shù)據(jù)等
報(bào)告啟動(dòng)異常,即若啟動(dòng)過程中拋出異常,此時(shí)喲個(gè)FailureAnalyzers來報(bào)告異常
最終返回容器對象,這里調(diào)用方法沒有聲明對象來接收
?
