一 面試提問(wèn)
1.1 Spring Boot啟動(dòng)流程
面試官:說(shuō)說(shuō)SpringBoot啟動(dòng)流程吧
我 :
首先從main找到run()方法,在執(zhí)行run()方法之前new一個(gè)SpringApplication對(duì)象
進(jìn)入run()方法,創(chuàng)建應(yīng)用監(jiān)聽(tīng)器SpringApplicationRunListeners開(kāi)始監(jiān)聽(tīng)
然后加載SpringBoot配置環(huán)境(ConfigurableEnvironment),然后把配置環(huán)境(Environment)加入監(jiān)聽(tīng)對(duì)象中
然后加載應(yīng)用上下文(ConfigurableApplicationContext),當(dāng)做run方法的返回對(duì)象
最后創(chuàng)建Spring容器,refreshContext(context),實(shí)現(xiàn)starter自動(dòng)化配置和bean的實(shí)例化等工作。
1.2 SpringBoot自動(dòng)裝配
面試官:說(shuō)說(shuō)SpringBoot自動(dòng)配置的原理
我: 通過(guò)@EnableAutoConfiguration注解在類路徑的META-INF/spring.factories文件中找到所有的對(duì)應(yīng)配置類,然后將這些自動(dòng)配置類加載到spring容器中。
二 知識(shí)點(diǎn)詳解
2.1 SpringBoot核心注解:
@SpringBootApplication注解是Spring Boot的核心注解,它其實(shí)是一個(gè)組合注解,包括三個(gè)注解
1、@Configuration: 被標(biāo)注的類等于在Spring的XML配置文件中(applicationContext.xml),裝配所有bean事務(wù),提供了一個(gè)Spring的上下文環(huán)境
2、@EnableAutoConfiguration: SpringBoot根據(jù)應(yīng)用所聲明的依賴來(lái)對(duì)Spring框架進(jìn)行自動(dòng)配置,其中包括兩個(gè)重要注解:
@AutoConfigurationPackage:該注解上有一個(gè)@Import({Registrar.class})注解,其中Registrar類的作用是將啟動(dòng)類所在的包下的所有子包組件掃描注入到spring容器中。
因此這就是為什么將controller、service等包放在啟動(dòng)類的同級(jí)目錄下的原因
@Import({AutoConfigurationImportSelector.class}):其中AutoConfigurationImportSelector類中有一個(gè)getCandidateConfigurations()方法,這個(gè)方法通過(guò)SpringFactoriesLoader.loadFactoryNames()查找位于META-INF/spring.factories文件中的所有自動(dòng)配置類并加載這些類。
3、@ComponentScan: 組件掃描,自動(dòng)掃描和裝配Bean,掃描SpringApplication的run方法中的ExammanagerApplication.class所在的包路徑下的文件,因此將啟動(dòng)類(main)放在跟包路徑下。它去尋找?guī)в蠤Component注解的類,并為其創(chuàng)建bean。
2.2詳細(xì)啟動(dòng)流程(結(jié)合源碼)
1.首先進(jìn)入run()方法,run方法中new創(chuàng)建了一個(gè)SpringApplication實(shí)例
publicstaticConfigurableApplicationContextrun(Class>[]primarySources,String[]args){ return(newSpringApplication(primarySources)).run(args); }
2.在SpringApplication的構(gòu)造方法里為SpringApplication對(duì)象賦一些初值。
3.構(gòu)造方法執(zhí)行完后,回到run()方法
該方法中實(shí)現(xiàn)了如下幾個(gè)關(guān)鍵步驟:
創(chuàng)建了應(yīng)用的監(jiān)聽(tīng)器SpringApplicationRunListeners并開(kāi)始監(jiān)聽(tīng)
加載SpringBoot配置環(huán)境(ConfigurableEnvironment),如果是通過(guò)web容器發(fā)布,會(huì)加載StandardEnvironment,其最終也是繼承了ConfigurableEnvironment
配置環(huán)境(Environment)加入到監(jiān)聽(tīng)器對(duì)象中(SpringApplicationRunListeners)
創(chuàng)建run方法的返回對(duì)象:ConfigurableApplicationContext(應(yīng)用配置上下文)
回到run方法內(nèi),prepareContext方法將listeners、environment、applicationArguments、banner等重要組件與上下文對(duì)象關(guān)聯(lián)
接下來(lái)的refreshContext(context)方法(初始化方法如下)將是實(shí)現(xiàn)spring-boot-starter-*(mybatis、redis等)自動(dòng)化配置的關(guān)鍵,包括spring.factories的加載,bean的實(shí)例化等核心工作。
配置結(jié)束后,Springboot做了一些基本的收尾工作,返回了應(yīng)用環(huán)境上下文?;仡櫿w流程,Springboot的啟動(dòng),主要?jiǎng)?chuàng)建了配置環(huán)境(environment)、事件監(jiān)聽(tīng)(listeners)、應(yīng)用上下文(applicationContext),并基于以上條件,在容器中開(kāi)始實(shí)例化我們需要的Bean,至此,通過(guò)SpringBoot啟動(dòng)的程序已經(jīng)構(gòu)造完成。
審核編輯:劉清
-
XML
+關(guān)注
關(guān)注
0文章
188瀏覽量
33142 -
Web服務(wù)器
+關(guān)注
關(guān)注
0文章
138瀏覽量
24487 -
監(jiān)聽(tīng)器
+關(guān)注
關(guān)注
0文章
12瀏覽量
14507 -
SpringBoot
+關(guān)注
關(guān)注
0文章
174瀏覽量
201
原文標(biāo)題:字節(jié):SpringBoot 啟動(dòng)流程
文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
SpringBoot應(yīng)用啟動(dòng)運(yùn)行run方法
嵌入式Servlet容器啟動(dòng)原理
Springboot是如何獲取自定義異常并進(jìn)行返回的
SpringBoot如何實(shí)現(xiàn)啟動(dòng)過(guò)程中執(zhí)行代碼
什么是 SpringBoot?
![什么是 <b class='flag-5'>SpringBoot</b>?](https://file1.elecfans.com/web2/M00/81/FF/wKgZomQvjQKARND_AADW0ILCMHE105.jpg)
SpringBoot的核心注解1
![<b class='flag-5'>SpringBoot</b>的核心注解1](https://file1.elecfans.com/web2/M00/81/FF/wKgZomQvuKaAF4VTAAC8XtTddps277.jpg)
SpringBoot的核心注解2
![<b class='flag-5'>SpringBoot</b>的核心注解2](https://file1.elecfans.com/web2/M00/81/FF/wKgaomQvuKaAJR8sAACgyrexpKI904.jpg)
使用springboot完成流程的業(yè)務(wù)功能
![使用<b class='flag-5'>springboot</b>完成<b class='flag-5'>流程</b>的業(yè)務(wù)功能](https://file1.elecfans.com/web2/M00/82/CA/wKgZomRh_guAOHfRAAAkJCs8frw364.png)
評(píng)論