spring-boot啟動(dòng)過(guò)程源碼分析 · 貳

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

從上面這張時(shí)序圖中,我們很直觀地看出run方法的執(zhí)行過(guò)程。其中最關(guān)鍵的內(nèi)容有兩部分,一個(gè)是和監(jiān)聽(tīng)器相關(guān)的操作,另一個(gè)是和應(yīng)用容器相關(guān)的操作,從圖上我們也可以看出這一點(diǎn),這兩個(gè)的內(nèi)容和操作都很多,而且基本上貫穿了整個(gè)run方法,所以下一步我們要分析的就是監(jiān)聽(tīng)器和應(yīng)用容器這兩塊的內(nèi)容,但是今天可能來(lái)不及分享了。
糾正謬誤
下面我們糾正昨天的一個(gè)謬誤,昨天我說(shuō)這段代碼是創(chuàng)建spring工廠實(shí)例,這么說(shuō)雖然沒(méi)有什么問(wèn)題,但結(jié)合整段代碼的邏輯來(lái)說(shuō)就是有問(wèn)題的。
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
new Class[] { ConfigurableApplicationContext.class }, context);
這段代碼在這里的作用是構(gòu)建SpringBootExceptionReporter的實(shí)例對(duì)象,構(gòu)建的對(duì)象是在catch中用的,詳細(xì)查看源代碼的話,你會(huì)發(fā)現(xiàn)其實(shí)它是用來(lái)分析啟動(dòng)過(guò)程中錯(cuò)誤的。下面的這段代碼,各位小伙伴看著肯定不陌生,在啟動(dòng)spring boot報(bào)錯(cuò)的時(shí)候會(huì)經(jīng)??吹剑?/p>
說(shuō)到這里,我們?cè)傺a(bǔ)充點(diǎn)spring boot啟動(dòng)異常處理的相關(guān)知識(shí)點(diǎn)。如果在啟動(dòng)過(guò)程中發(fā)生異常,spring boot會(huì)調(diào)用handleRunFailure方法處理異常,其中一個(gè)核心參數(shù)就是我們前面創(chuàng)建的SpringBootExceptionReporter實(shí)例集合,在方法內(nèi)部主要進(jìn)行了以下幾步操作:
處理退出碼。這個(gè)退出碼是從異常中獲取到的,獲取到之后會(huì)注冊(cè)到 SpringBootExceptionHandler中。調(diào)用監(jiān)聽(tīng)器 failed方法,推送ApplicationFailedEvent事件調(diào)用 reportFailure,打印錯(cuò)誤報(bào)告關(guān)閉 context容器拋出異常信息
方法源碼如下:

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