spring-boot啟動過程源碼分析 · 貳

前言
昨天我們從源碼層面簡單分析了一下spring boot的啟動過程,由于時間倉促,加上內(nèi)容都是臨場發(fā)揮,因此整個過程還是有點混亂的,而且內(nèi)容是也有一點點的謬誤,為了讓昨天的內(nèi)容看起來不那么混亂,同時也為了糾正昨天的謬誤,我們今天先來做一點點補充,這樣也有利于我梳理后續(xù)內(nèi)容的思路。下面就讓我們直接開始吧。
run方法源碼分析補充
昨天晚上我說過今天要先畫一個時序圖,所以開始之前,我們先看下run方法的執(zhí)行過程時序圖(時序圖源碼有需要的小伙伴可以發(fā)私信,為了保證清晰度我這里放的是svg格式的):

從上面這張時序圖中,我們很直觀地看出run方法的執(zhí)行過程。其中最關鍵的內(nèi)容有兩部分,一個是和監(jiān)聽器相關的操作,另一個是和應用容器相關的操作,從圖上我們也可以看出這一點,這兩個的內(nèi)容和操作都很多,而且基本上貫穿了整個run方法,所以下一步我們要分析的就是監(jiān)聽器和應用容器這兩塊的內(nèi)容,但是今天可能來不及分享了。
糾正謬誤
下面我們糾正昨天的一個謬誤,昨天我說這段代碼是創(chuàng)建spring工廠實例,這么說雖然沒有什么問題,但結合整段代碼的邏輯來說就是有問題的。
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
new Class[] { ConfigurableApplicationContext.class }, context);
這段代碼在這里的作用是構建SpringBootExceptionReporter的實例對象,構建的對象是在catch中用的,詳細查看源代碼的話,你會發(fā)現(xiàn)其實它是用來分析啟動過程中錯誤的。下面的這段代碼,各位小伙伴看著肯定不陌生,在啟動spring boot報錯的時候會經(jīng)常看到:

說到這里,我們再補充點spring boot啟動異常處理的相關知識點。如果在啟動過程中發(fā)生異常,spring boot會調用handleRunFailure方法處理異常,其中一個核心參數(shù)就是我們前面創(chuàng)建的SpringBootExceptionReporter實例集合,在方法內(nèi)部主要進行了以下幾步操作:
處理退出碼。這個退出碼是從異常中獲取到的,獲取到之后會注冊到 SpringBootExceptionHandler中。調用監(jiān)聽器 failed方法,推送ApplicationFailedEvent事件調用 reportFailure,打印錯誤報告關閉 context容器拋出異常信息
方法源碼如下:

好了,spring boot啟動主流程暫時就先分享這么多。
總結
經(jīng)過今天的梳理之后,我發(fā)現(xiàn)對于spring boot的啟動流程,整體感覺清晰了好多,特別是時序圖畫完之后。
而且更重要的是,從圖上我們直接就能很直觀地看出整個啟動流程,看清楚啟動過程的各個節(jié)點以及相關的操作,這就特別有助于我們理解spring boot的啟動過程,另外從時序圖上,我們還可以直觀地看出啟動過程的關鍵點、核心點,這樣也有助于我們把握知識的重點,確定下一步的學習計劃。
總之,我現(xiàn)在感覺畫圖確實是一個特別好的學習方式,比如畫腦圖、畫時序圖、流程圖等,這些圖表對于知識的梳理和總結都有著特別積極的效果,我是越來越喜歡這種方式了。
- END -