Springboot 2啟動源碼流程

来源:https://www.cnblogs.com/bigshark/archive/2019/08/15/11355655.html
-Advertisement-
Play Games

以使用靜態方法 啟動 Springboot 為例,啟動流程主要分為 SpringApplication 的創建和運行兩部分; 創建 1. 設置資源載入器,此處為空 2. 設置 Springboot 啟動類 3. 根據類路徑判斷 web 類型,預設為 SERVLET Spring MVC 4. 讀取每 ...


以使用靜態方法SpringApplication.run(Bootstrap.class, args)啟動 Springboot 為例,啟動流程主要分為 SpringApplication 的創建和運行兩部分;

創建

  1. 設置資源載入器,此處為空
  2. 設置 Springboot 啟動類
  3. 根據類路徑判斷 web 類型,預設為 SERVLET->Spring MVC
  4. 讀取每個 jar 包的 /META-INF/spring.factories 文件,獲取 key 為 org.springframework.context.ApplicationContextInitializer 的值,即初始化器
  5. 讀取每個 jar 包的 /META-INF/spring.factories 文件,獲取 key 為 org.springframework.context.ApplicationListener 的值,即監聽器
  6. 從當前的運行時堆棧元素中,找到 main 方法所在類

運行

  1. 啟動計時秒錶
  2. 讀取每個 jar 包的 /META-INF/spring.factories 文件,獲取 key 為 org.springframework.boot.SpringApplicationRunListener 的值,即 Springboot 的運行監聽器,預設有 EventPublishingRunListener
  3. 啟動監聽器,使用事件派發器向監聽器派發 ApplicationStartingEvent 事件
  4. 根據命令行參數 args 初始化 DefaultApplicationArguments
  5. 獲取環境配置,綁定到 Spring 應用,並派發 ApplicationEnvironmentPreparedEvent 事件
  6. 配置 spring.beaninfo.ignore 指定的可以忽略的 Bean
  7. 列印 Banner
  8. 根據 web 類型創建上下文,預設為 AnnotationConfigServletWebServerApplicationContext
  9. 讀取每個 jar 包的 /META-INF/spring.factories 文件,獲取 key 為 org.springframework.boot.SpringBootExceptionReporter 的值,即失敗分析器,預設有 FailureAnalyzers
  10. 準備上下文,即給它配置屬性,回調初始化器,並派發 ApplicationPreparedEvent 事件
  11. 刷新容器,創建 Bean 的過程,調用 refresh() 方法,見 Spring 源碼總結
  12. 刷新後的處理,空方法,子類可以實現該方法做額外的處理
  13. 停止秒錶,列印啟動時長
  14. 派發 ApplicationStartedEvent 事件
  15. 調用 ApplicationRunner、CommandLineRunner 的實現方法
  16. 派發 ApplicationReadyEvent 事件
  17. 如果啟動過程發生異常,派發 ApplicationFailedEvent 事件,並執行失敗分析器

一些初始化器和監聽器的作用

初始化器

  1. DelegatingApplicationContextInitializer:獲取環境配置 context.initializer.classes 指定的初始化器。
  2. ContextIdApplicationContextInitializer:初始化 Spring 應用名 ID:profile:PORT。(spring.application.name:spring.profiles.active:spring.application.name)
  3. ConfigurationWarningsApplicationContextInitializer:初始化配置檢查,輸出警告日誌。
  4. ServerPortInfoApplicationContextInitializer:初始化對 WebServerInitializedEvent 事件的監聽,將監聽器添加到派發器
  5. SharedMetadataReaderFactoryContextInitializer:初始化元數據讀取和緩存的後置處理器 CachingMetadataReaderFactoryPostProcessor。

監聽器

  1. ConfigFileApplicationListener:載入預設路徑下的配置文件。
  2. AnsiOutputApplicationListener:監聽 spring.output.ansi.enabled 是否配置了彩色輸出日誌。always:啟用彩色輸出;ever禁用彩色輸出;detect:(預設)自動檢測。
  3. LoggingApplicationListener:配置日誌系統。
  4. ClasspathLoggingApplicationListener:列印程式開始啟動和啟動失敗 classpath 的 debug 日誌。
  5. BackgroundPreinitializer:起一個後臺線程觸發早期的初始化器,包括校驗器、消息轉換器等。(MessageConverterInitializer、MBeanFactoryInitializer、ValidationInitializer、JacksonInitializer、ConversionServiceInitializer)
  6. DelegatingApplicationListener:獲取環境配置 context.listener.classes 指定的監聽器
  7. ParentContextCloserApplicationListener:如果父關閉了,則關閉應用程式上下文。它監聽 refresh 事件來獲取上下文,監聽到關閉事件後進行傳播。
  8. FileEncodingApplicationListener:如果系統文件和環境中配置的編碼不匹配,則停止應用程式。
  9. ClearCachesApplicationListener:上下文載入後清理緩存。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 工廠函數,顧名思義,就是通過一個"工廠的加工" 來創建一個函數 這種操作在需要創建多個相似對象時可以有效地減少重覆代碼,但是這樣有個缺點就是,每次調用工廠函數創建的對象都是獨立的object,不存在繼承關係,顯然,這樣的面向對象編程失去了靈魂 於是, 對象構造函數就出現了 使用構造函數有幾個要註意的 ...
  • 1、使用input透明覆蓋法 將input的z-index設置為1以上的數字並覆蓋到需點擊的內容上,將input的樣式opacity設置為0(即為透明度為0),這樣通過綁定在input上的change事件觸發 推薦 2、使用vue的ref參數直接操作input的點擊事件觸發 3、使用HTML的lab ...
  • 最終頁面顯示效果為 主頁面 parent.vue 子頁面child.vue有兩種方法 第一種 第二種 這是兩個最簡單的例子 參考鏈接 https://cn.vuejs.org/v2/guide/render-function.html ...
  • 在電腦科學中,圖是一種網路結構的抽象模型,它是一組由邊連接的頂點組成。一個圖G = (V, E)由以下元素組成: V:一組頂點 E:一組邊,連接V中的頂點 下圖表示了一個圖的結構: 在介紹如何用JavaScript實現圖之前,我們先介紹一些和圖相關的術語。 如上圖所示,由一條邊連接在一起的頂點稱為 ...
  • 深入淺出一致性Hash原理 ...
  • 文章轉載自:http://www.pythonheidong.com/blog/article/3303/ 一、數據結構與演算法基礎 · 說一下幾種常見的排序演算法和分別的複雜度。 · 用Java寫一個冒泡排序演算法 · 描述一下鏈式存儲結構。 · 如何遍歷一棵二叉樹? · 倒排一個LinkedList。 ...
  • 文章轉載自:http://www.pythonheidong.com/blog/article/3009/ 熱點隨筆: · [譯]Web設計者和開發者必備的28個Chrome插件(JK_Rush)· 程式員裝B指南(查一把)· javascript 設計模式 - 文章很長,請自備瓜子,水果和眼藥水( ...
  • server服務端 bin下的文件 ftp_server.py conf下的文件 accounts.ini(這個可以在執行中創建) settings.py core下的文件 main.py server.py user_handle.py client客戶端 download文件是儲存下載的文件;u ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...