日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot 应用程序启动过程探秘

發布時間:2025/3/19 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot 应用程序启动过程探秘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文共 946字,閱讀大約需要 3分鐘 !

概述

說到接觸 SpringBoot 伊始,給我第一映像最深的是有兩個關鍵元素:

對照上面的典型代碼,這個兩個元素分別是:

  • @SpringBootApplication
  • SpringApplication 以及 run() 方法

關于 @SpringBootApplication 注解的剖析已經在上文:《SpringBoot 中 @SpringBootApplication注解背后的三體結構探秘》 中完成了,其實它背后就是一個三體結構,只是 SpringBoot給了其一個包裝而已。那么本文我們就來看看這個 SpringApplication 以及 run() 方法 到底是個什么鬼,它背后又隱藏了哪些奧秘呢?

注: 本文首發于 My Personal Blog,歡迎光臨 小站

本文內容腦圖如下:


SpringApplication 驚鴻一瞥

SpringApplication 這個類應該算是 SpringBoot 框架 的“創新”產物了,原始的 Spring中并沒有這個類,SpringApplication 里面封裝了一套 Spring 應用的啟動流程,然而這對用戶完全透明,因此我們上手 SpringBoot 時感覺簡潔、輕量。

一般來說默認的 SpringApplication 執行流程已經可以滿足大部分需求,但是 若用戶想干預這個過程,則可以通過 SpringApplication 在流程某些地方開啟的 擴展點 來完成對流程的擴展,典型的擴展方案那就是使用 set 方法。

我們來舉一個栗子,把我們天天司空見慣的 SpringBoot 應用的啟動類來拆解一下寫出來:

@SpringBootApplication public class CodeSheepApplication {public static void main( String[] args ) {// SpringApplication.run( CodeSheepApplication.class args ); // 這是傳統SpringBoot應用的啟動,一行代碼搞定,內部默認做了很多事SpringApplication app = new SpringApplication( CodeSheepApplication.class );app.setXXX( ... ); // 用戶自定的擴展在此 !!!app.run( args );} }

這樣一拆解后我們發現,我們也需要先構造 SpringApplication 類對象,然后調用該對象的 run() 方法。那么接下來就講講 SpringApplication 的構造過程 以及其 run() 方法的流程,搞清楚了這個,那么也就搞清楚了SpringBoot應用是如何運行起來的!


SpringApplication 實例的初始化

我們對照代碼來看:

四個關鍵的步驟已標注在圖中,分別解釋如下:

  • 推斷應用的類型:創建的是 REACTIVE應用、SERVLET應用、NONE 三種中的某一種

  • 使用 SpringFactoriesLoader查找并加載 classpath下 META-INF/spring.factories文件中所有可用的 ApplicationContextInitializer

  • 使用 SpringFactoriesLoader查找并加載 classpath下 META-INF/spring.factories文件中的所有可用的 ApplicationListener

  • 推斷并設置 main方法的定義類



SpringApplication 的run()方法探秘

先看看代碼長啥樣子:

各個主要步驟我已經標注在上圖之中了,除此之外,我也按照自己的理解畫了一個流程圖如下所示,可以對照數字標示看一下:

我們將各步驟總結精煉如下:

  • 通過 SpringFactoriesLoader 加載 META-INF/spring.factories 文件,獲取并創建 SpringApplicationRunListener 對象
  • 然后由 SpringApplicationRunListener 來發出 starting 消息
  • 創建參數,并配置當前 SpringBoot 應用將要使用的 Environment
  • 完成之后,依然由 SpringApplicationRunListener 來發出 environmentPrepared 消息
  • 創建 ApplicationContext
  • 初始化 ApplicationContext,并設置 Environment,加載相關配置等
  • 由 SpringApplicationRunListener 來發出 contextPrepared 消息,告知SpringBoot 應用使用的 ApplicationContext 已準備OK
  • 將各種 beans 裝載入 ApplicationContext,繼續由 SpringApplicationRunListener 來發出 contextLoaded 消息,告知 SpringBoot 應用使用的 ApplicationContext 已裝填OK
  • refresh ApplicationContext,完成IoC容器可用的最后一步
  • 由 SpringApplicationRunListener 來發出 started 消息
  • 完成最終的程序的啟動
  • 由 SpringApplicationRunListener 來發出 running 消息,告知程序已運行起來了
  • 至此,全流程結束!



    后記

    由于能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!
    • My Personal Blog
    • 我的半年技術博客之路


    總結

    以上是生活随笔為你收集整理的SpringBoot 应用程序启动过程探秘的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。