一 面試提問
1.1 Spring Boot啟動流程
面試官:說說SpringBoot啟動流程吧
我 :
首先從main找到run()方法,在執行run()方法之前new一個SpringApplication對象
進入run()方法,創建應用監聽器SpringApplicationRunListeners開始監聽
然后加載SpringBoot配置環境(ConfigurableEnvironment),然后把配置環境(Environment)加入監聽對象中
然后加載應用上下文(ConfigurableApplicationContext),當做run方法的返回對象
最后創建Spring容器,refreshContext(context),實現starter自動化配置和bean的實例化等工作。
1.2 SpringBoot自動裝配
面試官:說說SpringBoot自動配置的原理
我: 通過@EnableAutoConfiguration注解在類路徑的META-INF/spring.factories文件中找到所有的對應配置類,然后將這些自動配置類加載到spring容器中。
二 知識點詳解
2.1 SpringBoot核心注解:
@SpringBootApplication注解是Spring Boot的核心注解,它其實是一個組合注解,包括三個注解
1、@Configuration: 被標注的類等于在Spring的XML配置文件中(applicationContext.xml),裝配所有bean事務,提供了一個Spring的上下文環境
2、@EnableAutoConfiguration: SpringBoot根據應用所聲明的依賴來對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)放在跟包路徑下。它去尋找帶有@Component注解的類,并為其創建bean。
2.2詳細啟動流程(結合源碼)
1.首先進入run()方法,run方法中new創建了一個SpringApplication實例
publicstaticConfigurableApplicationContextrun(Class>[]primarySources,String[]args){ return(newSpringApplication(primarySources)).run(args); }
2.在SpringApplication的構造方法里為SpringApplication對象賦一些初值。
3.構造方法執行完后,回到run()方法
該方法中實現了如下幾個關鍵步驟:
創建了應用的監聽器SpringApplicationRunListeners并開始監聽
加載SpringBoot配置環境(ConfigurableEnvironment),如果是通過web容器發布,會加載StandardEnvironment,其最終也是繼承了ConfigurableEnvironment
配置環境(Environment)加入到監聽器對象中(SpringApplicationRunListeners)
創建run方法的返回對象:ConfigurableApplicationContext(應用配置上下文)
回到run方法內,prepareContext方法將listeners、environment、applicationArguments、banner等重要組件與上下文對象關聯
接下來的refreshContext(context)方法(初始化方法如下)將是實現spring-boot-starter-*(mybatis、redis等)自動化配置的關鍵,包括spring.factories的加載,bean的實例化等核心工作。
配置結束后,Springboot做了一些基本的收尾工作,返回了應用環境上下文。回顧整體流程,Springboot的啟動,主要創建了配置環境(environment)、事件監聽(listeners)、應用上下文(applicationContext),并基于以上條件,在容器中開始實例化我們需要的Bean,至此,通過SpringBoot啟動的程序已經構造完成。
審核編輯:劉清
-
XML
+關注
關注
0文章
188瀏覽量
33535 -
Web服務器
+關注
關注
0文章
138瀏覽量
24742 -
監聽器
+關注
關注
0文章
12瀏覽量
14569 -
SpringBoot
+關注
關注
0文章
175瀏覽量
307
原文標題:字節:SpringBoot 啟動流程
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
SpringBoot應用啟動運行run方法
嵌入式Servlet容器啟動原理
Springboot是如何獲取自定義異常并進行返回的
SpringBoot如何實現啟動過程中執行代碼
什么是 SpringBoot?

使用springboot完成流程的業務功能

評論