Spring源碼0. springboot啟動流程以及源碼剖析目錄

目錄

????1. 初始化SpringApplication實例

????2. 發(fā)布啟動事件ApplicationStartingEvent

????3. 封裝命令行參數(shù)DefaultApplicationArguments

????4. prepareEnvironment()準(zhǔn)備環(huán)境

????5. printBanner()打印Banner

????6. createApplicationContext()創(chuàng)建應(yīng)用上下文

????7. SpringBootExceptionReporter異常上報

????8. prepareContext()準(zhǔn)備應(yīng)用上下文

????9. refreshContext()刷新應(yīng)用上下文

????10. 啟動完成, 發(fā)布ApplicationStartedEvent, ApplicationReadyEvent事件


前言

當(dāng)我們使用springboot的時候, 我們只需要配置如下啟動類, spring便可以配置所有的環(huán)境和上下文, 本文基于springboot2.1.3, 剖析spring的啟動流程和原理

@SpringBootApplication
public class YanggxApplication {
    public static void main(String[] args) {
        //調(diào)用SpringApplication的run方法
        SpringApplication.run(YanggxApplication.class, args);
    }
}

SpringApplication運(yùn)行代碼

SpringApplication整個啟動流程大概分為10個重要的步驟, 將會在之后的文章中逐個步驟分析

public class SpringApplication {
    
    //SpringApplication.run方法
    public static ConfigurableApplicationContext run(Class<?>[] primarySources,
            String[] args) {
        //步驟1. 初始化SpringApplication實例
        return new SpringApplication(primarySources).run(args);
    }

    /**
     * 啟動Spring 應(yīng)用
     * @param args YanggxApplication中main函數(shù)的參數(shù)
     */
    public ConfigurableApplicationContext run(String... args) {
        //實例化一個StopWatch實例, 監(jiān)控項目運(yùn)行時間
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        //初始化Spring上下文和錯誤報告參數(shù)
        ConfigurableApplicationContext context = null;
        Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
        //配置headless,在沒有顯示器,鼠標(biāo),鍵盤的情況下,仍然可以調(diào)用顯示,輸入輸出的方法
        configureHeadlessProperty();
    
        //步驟2.發(fā)布Spring啟動事件
        //獲取SpringApplicationRunListeners
        //listeners的監(jiān)聽器列表中只包含了一個EventPublishingRunListener對象
        SpringApplicationRunListeners listeners = getRunListeners(args);
    
        //調(diào)用SpringFactoriesLoader#starting方法,
        //最終調(diào)用EventPublishingRunListener#starting方法
        listeners.starting();
        
        try {
            //步驟3. 封裝命令行參數(shù)DefaultApplicationArguments
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            
            //步驟4. prepareEnvironment()準(zhǔn)備環(huán)境
            ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);
            configureIgnoreBeanInfo(environment);
            
            //步驟5: printBanner()打印Banner
            Banner printedBanner = printBanner(environment);
            
            //步驟6: createApplicationContext()創(chuàng)建應(yīng)用上下文
            context = createApplicationContext();
            
            //步驟7: SpringBootExceptionReporter異常上報
            exceptionReporters = getSpringFactoriesInstances(
                    SpringBootExceptionReporter.class,
                    new Class[] { ConfigurableApplicationContext.class }, context);
            //步驟8: prepareContext()準(zhǔn)備應(yīng)用上下文
            prepareContext(context, environment, listeners, applicationArguments,printedBanner);
            
            //步驟9: refreshContext()刷新應(yīng)用上下文
            refreshContext(context);
            
            //步驟10: 啟動完成, 發(fā)布ApplicationStartedEvent, ApplicationReadyEvent事件
            afterRefresh(context, applicationArguments);
            stopWatch.stop();
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(),stopWatch);
            }
            //發(fā)布ApplicationStartedEvent
            listeners.started(context);
            callRunners(context, applicationArguments);
        }
        catch (Throwable ex) {
            handleRunFailure(context, ex, exceptionReporters, listeners);
            throw new IllegalStateException(ex);
        }
    
        try {
            //發(fā)布ApplicationReadyEvent事件
            listeners.running(context);
        }
        catch (Throwable ex) {
            handleRunFailure(context, ex, exceptionReporters, null);
            throw new IllegalStateException(ex);
        }
        return context;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忙迁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌攘须,老刑警劉巖窄绒,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件为朋,死亡現(xiàn)場離奇詭異积仗,居然都是意外死亡擅编,警方通過查閱死者的電腦和手機(jī)谈跛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門羊苟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人感憾,你說我怎么就攤上這事蜡励。” “怎么了阻桅?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵凉倚,是天一觀的道長。 經(jīng)常有香客問我嫂沉,道長稽寒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任趟章,我火速辦了婚禮杏糙,結(jié)果婚禮上慎王,老公的妹妹穿的比我還像新娘。我一直安慰自己宏侍,他們只是感情好赖淤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咱旱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绷耍。 梳的紋絲不亂的頭發(fā)上吐限,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音毯盈,去河邊找鬼病袄。 笑死益缠,一個胖子當(dāng)著我的面吹牛脑奠,可吹牛的內(nèi)容都是我干的宋欺。 我是一名探鬼主播齿诞,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了私蕾?” 一聲冷哼從身側(cè)響起踩叭,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗤疯,沒想到半個月后茂缚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悔耘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年衬以,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摹芙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情承绸,我是刑警寧澤挣轨,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布彤委,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彬呻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一湖苞、第九天 我趴在偏房一處隱蔽的房頂上張望财骨。 院中可真熱鬧,春花似錦兜材、人聲如沸理澎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硝烂。三九已至铜幽,卻和暖如春到忽,著一層夾襖步出監(jiān)牢的瞬間橄教,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工负饲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堤魁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓返十,卻偏偏與公主長得像妥泉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洞坑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容