Spring?Boot面試必問之啟動流程知識點詳解
一 面試提問
1.1 Spring Boot啟動流程
???面試官:說說SpringBoot啟動流程吧
?? 我 :
- 首先從main找到run()方法,在執(zhí)行run()方法之前new一個SpringApplication對象
- 進入run()方法,創(chuàng)建應(yīng)用監(jiān)聽器SpringApplicationRunListeners開始監(jiān)聽
- 然后加載SpringBoot配置環(huán)境(ConfigurableEnvironment),然后把配置環(huán)境(Environment)加入監(jiān)聽對象中
- 然后加載應(yīng)用上下文(ConfigurableApplicationContext),當(dāng)做run方法的返回對象
- 最后創(chuàng)建Spring容器,refreshContext(context),實現(xiàn)starter自動化配置和bean的實例化等工作。
1.2 SpringBoot自動裝配
???面試官:說說SpringBoot自動配置的原理
?? 我:通過@EnableAutoConfiguration注解在類路徑的META-INF/spring.factories文件中找到所有的對應(yīng)配置類,然后將這些自動配置類加載到spring容器中。
二 知識點詳解
2.1 SpringBoot核心注解:
@SpringBootApplication注解是Spring Boot的核心注解,它其實是一個組合注解,包括三個注解
1、@Configuration:被標(biāo)注的類等于在Spring的XML配置文件中(applicationContext.xml),裝配所有bean事務(wù),提供了一個Spring的上下文環(huán)境
2、@EnableAutoConfiguration:SpringBoot根據(jù)應(yīng)用所聲明的依賴來對Spring框架進行自動配置,其中包括兩個重要注解:
@AutoConfigurationPackage:該注解上有一個@Import({Registrar.class})注解,其中Registrar類的作用是將啟動類所在的包下的所有子包組件掃描注入到spring容器中。
因此這就是為什么將controller、service等包放在啟動類的同級目錄下的原因@Import({AutoConfigurationImportSelector.class}):其中AutoConfigurationImportSelector類中有一個getCandidateConfigurations()方法,這個方法通過SpringFactoriesLoader.loadFactoryNames()查找位于META-INF/spring.factories文件中的所有自動配置類并加載這些類。

3、@ComponentScan:組件掃描,自動掃描和裝配Bean,掃描SpringApplication的run方法中的ExammanagerApplication.class所在的包路徑下的文件,因此將啟動類(main)放在跟包路徑下。它去尋找?guī)в?code>@Component注解的類,并為其創(chuàng)建bean。
2.2詳細啟動流程(結(jié)合源碼)
首先進入run()方法,run方法中new創(chuàng)建了一個SpringApplication實例
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
return (new SpringApplication(primarySources)).run(args);
}
在SpringApplication的構(gòu)造方法里為SpringApplication對象賦一些初值。

構(gòu)造方法執(zhí)行完后,回到run()方法

該方法中實現(xiàn)了如下幾個關(guān)鍵步驟:
- 創(chuàng)建了應(yīng)用的監(jiān)聽器SpringApplicationRunListeners并開始監(jiān)聽
- 加載SpringBoot配置環(huán)境(ConfigurableEnvironment),如果是通過web容器發(fā)布,會加載StandardEnvironment,其最終也是繼承了ConfigurableEnvironment
- 配置環(huán)境(Environment)加入到監(jiān)聽器對象中(SpringApplicationRunListeners)
- 創(chuàng)建run方法的返回對象:ConfigurableApplicationContext(應(yīng)用配置上下文)
- 回到run方法內(nèi),prepareContext方法將listeners、environment、applicationArguments、banner等重要組件與上下文對象關(guān)聯(lián)
- 接下來的refreshContext(context)方法(初始化方法如下)將是實現(xiàn)spring-boot-starter-*(mybatis、redis等)自動化配置的關(guān)鍵,包括spring.factories的加載,bean的實例化等核心工作。

配置結(jié)束后,Springboot做了一些基本的收尾工作,返回了應(yīng)用環(huán)境上下文?;仡櫿w流程,Springboot的啟動,主要創(chuàng)建了配置環(huán)境(environment)、事件監(jiān)聽(listeners)、應(yīng)用上下文(applicationContext),并基于以上條件,在容器中開始實例化我們需要的Bean,至此,通過SpringBoot啟動的程序已經(jīng)構(gòu)造完成。
總結(jié)
到此這篇關(guān)于Spring Boot面試必問之啟動流程的文章就介紹到這了,更多相關(guān)SpringBoot啟動流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java commons-httpclient如果實現(xiàn)get及post請求
這篇文章主要介紹了Java commons-httpclient如果實現(xiàn)get及post請求,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Java+opencv3.2.0實現(xiàn)hough圓檢測功能
這篇文章主要為大家詳細介紹了Java+opencv3.2.0實現(xiàn)hough圓檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
SpringBoot使用Swagger生成多模塊的API文檔
這篇文章將以?Spring?Boot?多模塊項目為例,為大家詳細介紹一下如何使用?Swagger?生成多模塊的?API?文檔,感興趣的小伙伴可以了解一下2025-02-02
你知道怎么從Python角度學(xué)習(xí)Java基礎(chǔ)
這篇文章主要為大家詳細介紹了Python角度學(xué)習(xí)Java基礎(chǔ)的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02

