springboot啟動過程

1、SpringApplication new一個對象會優先調用initialize方法

public SpringApplication(Object... sources) {initialize(sources);
}
private void initialize(Object[] sources) {//添加配置類@SpringBootApplicationif (sources != null && sources.length > 0) {this.sources.addAll(Arrays.asList(sources));}//判斷是不是運行在web環境中this.webEnvironment = deduceWebEnvironment();//從spring.factories加載出所有實現org.springframework.context.ApplicationContextInitializer初始化器,并且通過反射創建實例//Tomcat ---org.springframework.boot.web.servlet.support.ServletContextApplicationContextInitializersetInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));//從spring.factories中org.springframework.context.ApplicationListener找到配置類,并且反射創建實例。setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));//確認入口類,通常是這種/*  public static void main(String[] args) {**	    SpringApplication.run(DemoApplication.class, args);**  }*/this.mainApplicationClass = deduceMainApplicationClass();
}

?2、確認入口類之后,就是SpringApplication.run(XXXXApplication.class, args);的調用了。

	/*** Run the Spring application, creating and refreshing a new* {@link ApplicationContext}.* @param args the application arguments (usually passed from a Java main method)* @return a running {@link ApplicationContext}*/public ConfigurableApplicationContext run(String... args) {StopWatch stopWatch = new StopWatch();stopWatch.start();ConfigurableApplicationContext context = null;FailureAnalyzers analyzers = null;configureHeadlessProperty();//獲取應用運行監聽器,并觸發開始事件SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();try {//創建應用參數對象ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);// 準備環境,包括配置文件和屬性源ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);//打印應用的 BannerBanner printedBanner = printBanner(environment);//獲取當前ConfigurableApplicationContext應用上下文。context = createApplicationContext();//獲取失敗分析器analyzers = new FailureAnalyzers(context);// 準備上下文,包括加載 bean 定義prepareContext(context, environment, listeners, applicationArguments,printedBanner);//調用spring refresh 方法refreshContext(context);//refresh的后置處理afterRefresh(context, applicationArguments);//通知所有基于SpringApplicationRunListeners回調完成。listeners.finished(context, null);stopWatch.stop();if (this.logStartupInfo) {new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);}return context;}catch (Throwable ex) {handleRunFailure(context, listeners, analyzers, ex);throw new IllegalStateException(ex);}}private void prepareContext(ConfigurableApplicationContext context,ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments, Banner printedBanner) {//ConfigurableApplicationContext綁定一個environment,環境參數context.setEnvironment(environment);//2、application的后置處理postProcessApplicationContext(context);//3、ConfigurableApplicationContext綁定ApplicationContextInitializerapplyInitializers(context);//4、通知監聽器ConfigurableApplicationContext準備工作已完成listeners.contextPrepared(context);if (this.logStartupInfo) {logStartupInfo(context.getParent() == null);logStartupProfileInfo(context);}// Add boot specific singleton beans//向ConfigurableApplicationContext添加特定的單例Beancontext.getBeanFactory().registerSingleton("springApplicationArguments",applicationArguments);if (printedBanner != null) {context.getBeanFactory().registerSingleton("springBootBanner", printedBanner);}// Load the sources//加載配置BeanSet<Object> sources = getSources();Assert.notEmpty(sources, "Sources must not be empty");//ConfigurableApplicationContext綁定配置Bean 并且轉化為BD。load(context, sources.toArray(new Object[sources.size()]));//通知監聽器ConfigurableApplicationContext加載完成listeners.contextLoaded(context);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161592.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161592.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161592.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于一些bug的解決1、el-input的輸入無效2、搜索之后發現數據不對3、el多選框、單選框點擊無用4、

el-input輸入無效 原來的代碼是 var test null 但是我發現不能輸入任何值 反倒修改test的初始值為123是可以的 于是我確定綁定沒問題 就是修改的問題 于是改成 var test ref&#xff08;&#xff09; v-model綁定的值改成test.value就可以了 因為ref是相應式的 可以通過輸入…

【算法】奇偶游戲(帶權并查集)

題目 小 A 和小 B 在玩一個游戲。 首先&#xff0c;小 A 寫了一個由 0 和 1 組成的序列 S&#xff0c;長度為 N。 然后&#xff0c;小 B 向小 A 提出了 M 個問題。 在每個問題中&#xff0c;小 B 指定兩個數 l 和 r&#xff0c;小 A 回答 S[l~r] 中有奇數個 1 還是偶數個 …

cocos2dx ??Animate3D(三)

一些總結 動作&#xff08;Actions&#xff09; move移動&#xff1a;moveto/moveby 從一個位置移動到另外一個位置 從一個位置移動多少數量級rotate旋轉&#xff1a;rotateto/rotateby 從一個角度旋轉到另外一個角度 旋轉多少個數量級scale縮放&#xff1a;scaleto/scaleby …

vue實現瀏覽器禁止鼠標選中文字禁止右鍵禁止F12鍵

1. 禁止鼠標選中文字 document.onselectstart new Function("event.returnValuefalse");2.禁止右鍵 document.oncontextmenu new Function("event.returnValuefalse");3. 禁止F12鍵 document.addEventListener("keydown", function (e) {if…

Go語言多線程爬蟲萬能模板它來了!

對于長期從事爬蟲行業的技術員來說&#xff0c;通過技術手段實現抓取海量數據并且做到可視化處理&#xff0c;我在想如果能寫一個萬能的爬蟲模板&#xff0c;后期遇到類似的工作只要套用模板就能解決大部分的問題&#xff0c;如此提高工作效率何樂而不為&#xff1f; 以下是一個…

有關Vue、微信小程序、UniApp中的CSS中的寬度width單位、自適應

在Vue中&#xff0c;可以使用以下單位來設置寬度&#xff08;width&#xff09; 像素&#xff08;px&#xff09;&#xff1a;最常用的單位&#xff0c;表示一個絕對長度單位。例如&#xff0c;width: 200px; 表示寬度為200像素。百分比&#xff08;%&#xff09;&#xff1a;…

Mac自帶的看圖如何連續查看多張圖片

一、問題 mac看訪達里的圖片時&#xff0c;雙擊打開一張圖片&#xff0c;然后按上下左右鍵都沒法切換到另外的圖片。而且也沒找到像window一樣單擊縮略圖可以看到預覽圖。其實是自己不懂得怎么使用&#xff0c;哈哈哈&#x1f602; 二、方法 2.1、圖標方式 可以看到縮略圖&a…

新的centos7.9安裝jenkins(二)

更多ruoyi-nbcio功能請看演示系統 gitee源代碼地址 前后端代碼&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后臺管理系統 接上一節文章。 這個版本默認git也安裝好了&#xff0c;所以全局配置這個不需要了。 maven安裝3.9.3版本…

前綴和——DP35 【模板】二維前綴和

文章目錄 &#x1f34e;1. 題目&#x1f352;2. 算法原理&#x1f345;3. 代碼實現 &#x1f34e;1. 題目 題目鏈接&#xff1a;【模板】二維前綴和_牛客題霸_牛客網 (nowcoder.com) 描述 給你一個 n 行 m 列的矩陣 A &#xff0c;下標從1開始。 接下來有 q 次查詢&#xff0…

ElasticSearch的日志配置

ElasticSearch默認情況下使用Log4j2來記錄日志&#xff0c;日志配置文件的路徑為$ES_HOME/config/log4j2.properties&#xff0c;配置方法見Log4j2的官方文檔。 參考path-settings&#xff0c;通過指定path.logs&#xff0c;可以指定日志文件的保存路徑。 在日志配置文件$ES_…

【OpenCV實現圖像:使用OpenCV生成拼圖效果】

文章目錄 概要通用配置不考慮間隔代碼實現考慮間隔代碼實現小結 概要 概要&#xff1a; 拼圖效果是一種將圖像切割為相鄰正方形并重新排列的藝術效果。在生成拼圖效果時&#xff0c;可以考慮不同的模式&#xff0c;包括是否考慮間隔和如何處理不能整除的部分。 不考慮間隔&a…

【NLP】GPT 模型如何工作

介紹 2021 年&#xff0c;我使用 GPT 模型編寫了最初的幾行代碼&#xff0c;那時我意識到文本生成已經達到了拐點。我要求 GPT-3 總結一份很長的文檔&#xff0c;并嘗試了幾次提示。我可以看到結果比以前的模型先進得多&#xff0c;這讓我對這項技術感到興奮&#xff0c;并渴望…

HQL刷題 50道

HQL刷題 50道 尚硅谷HQL刷題網站 答案 1.查詢累積銷量排名第二的商品 select sku_id from (select sku_id, dense_rank() over (order by total desc) rnfrom (select sku_id, sum(sku_num) totalfrom order_detailgroup by sku_id) t1) t2 where rn 2;2.查詢至少連續三天下…

php 時區查看和設置

php的時區&#xff0c;關系到相關時間函數的結果 其他相關&#xff1a; linux時區設置&#xff1a;鏈接 pgsql時區設置&#xff1a; 一、查看可以用的時區列表 新建一個php文件&#xff0c;輸入下面程序即可 <?php echo "<pre>"; var_dump(timezone_id…

基于go-zero的rpc服務示例

以下是一個基于 go-zero 框架的簡單 RPC 服務示例&#xff0c;該示例包括一個服務端和一個客戶端通過 gRPC 進行通信。 服務端 1、定義 .proto 文件 在 rpc/add 目錄下創建 adder.proto 文件&#xff0c;定義 RPC 服務&#xff1a; syntax "proto3";package add…

IOS+Appium+Python自動化全實戰教程

由于公司的產品坐落于不同的平臺&#xff0c;如ios、mac、Android、windows、web。因此每次有新需求的時候&#xff0c;開發結束后&#xff0c;留給測試的時間也不多。此外&#xff0c;一些新的功能實現&#xff0c;偶爾會影響其他的模塊功能正常的使用。 網上的ios自動化方面的…

MyBatis-Plus的分頁插件和樂觀鎖插件

MyBatis-Plus: 探索分頁查詢和樂觀鎖插件 在現代的Web應用開發中&#xff0c;高效的數據處理是不可或缺的一部分。MyBatis-Plus&#xff0c;作為MyBatis的增強版&#xff0c;提供了多種插件來簡化和優化數據庫操作。在這篇博客中&#xff0c;我們將重點介紹兩個非常實用的插件…

09_面向對象高級_泛型

泛型 1. 認識泛型 定義類、接口、方法時&#xff0c;同時聲明了一個或多個類型變量&#xff08;如&#xff1a;&#xff09;&#xff0c;稱為泛型類、泛型接口、泛型方法、它們統稱為泛型。 2. 泛型類 public class Test {public static void main(String[] args) {MyArray…

計算機網絡之物理層(數據通信有關)

一、概述 1.1物理層引入的目的 屏蔽掉傳輸介質的多樣性&#xff0c;導致數據傳輸方式的不同&#xff1b;物理層的引入使得高層看到的數據都是統一的0,1構成的比特流 1.2.物理層如何實現屏蔽 物理層靠定義的不同的通信協議&#xff08;一般稱通信規程&#xff09; 這些協議…

基于高質量訓練數據,GPT-4 Turbo更出色更強大

11月7日消息&#xff0c;OpenAI在首屆開發者大會上正式推出了GPT-4 Turbo。 與GPT-4相比&#xff0c;GPT-4 Turbo主要有6方面的提升&#xff1a; 1、擴展下文對話長度&#xff1a;GPT4最大只能支持8k的上下文長度&#xff08;約等于6000個單詞&#xff09;&#xff0c;而GPT-4…