0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

說(shuō)說(shuō)SpringBoot啟動(dòng)流程吧

jf_ro2CN3Fa ? 來(lái)源:CSDN ? 2023-03-28 17:52 ? 次閱讀

一 面試提問(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注解在類(lèi)路徑的META-INF/spring.factories文件中找到所有的對(duì)應(yīng)配置類(lèi),然后將這些自動(dòng)配置類(lèi)加載到spring容器中。

二 知識(shí)點(diǎn)詳解

2.1 SpringBoot核心注解:

@SpringBootApplication注解是Spring Boot的核心注解,它其實(shí)是一個(gè)組合注解,包括三個(gè)注解

1、@Configuration: 被標(biāo)注的類(lèi)等于在Spring的XML配置文件中(applicationContext.xml),裝配所有bean事務(wù),提供了一個(gè)Spring的上下文環(huán)境

2、@EnableAutoConfiguration: SpringBoot根據(jù)應(yīng)用所聲明的依賴(lài)來(lái)對(duì)Spring框架進(jìn)行自動(dòng)配置,其中包括兩個(gè)重要注解:

@AutoConfigurationPackage:該注解上有一個(gè)@Import({Registrar.class})注解,其中Registrar類(lèi)的作用是將啟動(dòng)類(lèi)所在的包下的所有子包組件掃描注入到spring容器中。

因此這就是為什么將controller、service等包放在啟動(dòng)類(lèi)的同級(jí)目錄下的原因

@Import({AutoConfigurationImportSelector.class}):其中AutoConfigurationImportSelector類(lèi)中有一個(gè)getCandidateConfigurations()方法,這個(gè)方法通過(guò)SpringFactoriesLoader.loadFactoryNames()查找位于META-INF/spring.factories文件中的所有自動(dòng)配置類(lèi)并加載這些類(lèi)。

47c39daa-cd36-11ed-bfe3-dac502259ad0.png

3、@ComponentScan: 組件掃描,自動(dòng)掃描和裝配Bean,掃描SpringApplication的run方法中的ExammanagerApplication.class所在的包路徑下的文件,因此將啟動(dòng)類(lèi)(main)放在跟包路徑下。它去尋找?guī)в蠤Component注解的類(lèi),并為其創(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ì)象賦一些初值。

47cb174c-cd36-11ed-bfe3-dac502259ad0.png

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

47f4e96e-cd36-11ed-bfe3-dac502259ad0.png

該方法中實(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í)例化等核心工作。

480b5492-cd36-11ed-bfe3-dac502259ad0.png

配置結(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)造完成。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • XML
    XML
    +關(guān)注

    關(guān)注

    0

    文章

    186

    瀏覽量

    33014
  • Web服務(wù)器
    +關(guān)注

    關(guān)注

    0

    文章

    137

    瀏覽量

    24347
  • 監(jiān)聽(tīng)器
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    14427
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    153

原文標(biāo)題:字節(jié):SpringBoot 啟動(dòng)流程

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SpringBoot中的Druid介紹

    SpringBoot中Druid數(shù)據(jù)源配置
    發(fā)表于 05-07 09:21

    SpringBoot知識(shí)總結(jié)

    SpringBoot干貨學(xué)習(xí)總結(jié)
    發(fā)表于 08-01 10:40

    怎么學(xué)習(xí)SpringBoot

    SpringBoot學(xué)習(xí)之路(X5)- 整合JPA
    發(fā)表于 06-10 14:52

    怎樣去使用springboot

    怎樣去使用springboot呢?學(xué)習(xí)springboot需要懂得哪些?
    發(fā)表于 10-25 07:13

    SpringBoot嵌入式Servlet容器啟動(dòng)原理是什么

    SpringBoot嵌入式Servlet容器啟動(dòng)原理思維導(dǎo)圖
    發(fā)表于 12-20 07:26

    SpringBoot應(yīng)用啟動(dòng)運(yùn)行run方法

    什么時(shí)候創(chuàng)建嵌入式的Servlet容器工廠(chǎng)?什么時(shí)候獲取嵌入式的Servlet容器并啟動(dòng)Tomcat;獲取嵌入式的Servlet容器工廠(chǎng):1)、SpringBoot應(yīng)用啟動(dòng)運(yùn)行run方法2
    發(fā)表于 12-20 06:16

    嵌入式Servlet容器啟動(dòng)原理

    SpringBoot源碼學(xué)習(xí)系列之嵌入式Servlet容器啟動(dòng)原理SpringBoot的自動(dòng)配置就是SpringBoot的精髓所在,對(duì)于Spring
    發(fā)表于 12-22 07:23

    Springboot是如何獲取自定義異常并進(jìn)行返回的

    源碼剖析Springboot是如何獲取自定義異常并進(jìn)行返回的。來(lái)吧!第一步:肯定是在Springboot啟動(dòng)的過(guò)程中進(jìn)行的異常處理初始化,于是就找到了handlerExceptionResolver類(lèi)
    發(fā)表于 03-22 14:15

    基于A(yíng)RM的Bootloader啟動(dòng)流程研究

    基于A(yíng)RM的Bootloader啟動(dòng)流程研究
    發(fā)表于 10-30 16:22 ?10次下載
    基于A(yíng)RM的Bootloader<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>流程</b>研究

    SpringBoot如何實(shí)現(xiàn)啟動(dòng)過(guò)程中執(zhí)行代碼

    目前開(kāi)發(fā)的SpringBoot項(xiàng)目在啟動(dòng)的時(shí)候需要預(yù)加載一些資源。而如何實(shí)現(xiàn)啟動(dòng)過(guò)程中執(zhí)行代碼,或啟動(dòng)成功后執(zhí)行,是有很多種方式可以選擇,我們可以在static代碼塊中實(shí)現(xiàn),也可以在構(gòu)
    的頭像 發(fā)表于 06-20 17:32 ?1387次閱讀

    什么是 SpringBoot

    本文從為什么要有 `SpringBoot`,以及 `SpringBoot` 到底方便在哪里開(kāi)始入手,逐步分析了 `SpringBoot` 自動(dòng)裝配的原理,最后手寫(xiě)了一個(gè)簡(jiǎn)單的 `start` 組件,通過(guò)實(shí)戰(zhàn)來(lái)體會(huì)了 `
    的頭像 發(fā)表于 04-07 11:28 ?1229次閱讀
    什么是 <b class='flag-5'>SpringBoot</b>?

    SpringBoot的核心注解1

    今天跟大家來(lái)探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置
    的頭像 發(fā)表于 04-07 14:34 ?643次閱讀
    <b class='flag-5'>SpringBoot</b>的核心注解1

    SpringBoot的核心注解2

    今天跟大家來(lái)探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置
    的頭像 發(fā)表于 04-07 14:34 ?1899次閱讀
    <b class='flag-5'>SpringBoot</b>的核心注解2

    使用springboot完成流程的業(yè)務(wù)功能

    圖 使用springboot開(kāi)發(fā)流程使用的接口完成流程的業(yè)務(wù)功能 基于 Spring Boot + MyBatis Plus + Vue Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC
    的頭像 發(fā)表于 05-15 17:40 ?640次閱讀
    使用<b class='flag-5'>springboot</b>完成<b class='flag-5'>流程</b>的業(yè)務(wù)功能

    springboot啟動(dòng)流程

    。 Spring Boot 的啟動(dòng)流程可以分為以下幾個(gè)步驟:初始化啟動(dòng)環(huán)境、加載自動(dòng)配置類(lèi)、創(chuàng)建 Spring 上下文、啟動(dòng)嵌入式服務(wù)器。 初始化
    的頭像 發(fā)表于 11-22 16:04 ?609次閱讀