SpringBoot項目啓動過程源碼終於整體捋了一遍(一)

寫在前面:這幾天擼這段源碼過程中,發現好多東西之前都忽視了,所以決定連載幾篇,把之前漏掉的、現在想起來了的,都整理總結下來。

Spring Boot項目啓動過程這個問題過於經典,之前也是能說上來一點,但是說實話,源碼都是一個片段一個片段的看過,沒有系統性地連起來,這幾天從頭開始捋了一遍,也不是閒的無聊,是因爲確實遇到了一個問題。

問題是這樣的:現在項目部署一般都分測試環境和生成環境甚至更多,不同環境中有些配置勢必會存在差異,Spring Boot提供了一種快捷的方式去切換配置文件,即將不同環境的配置文件分開,命名規則爲application-{env}.yml,如下:

 啓動jar包時加上啓動參數--spring.profiles.active={env},即可以切換對應env的環境配置文件,如下:

這種切換配置文件的方式很方便也很常用,之前也都是照葫蘆畫瓢地用着,也沒想過爲什麼這樣就行了,最近新開發了一個服務,從啓動類開始寫的那種開發,然後自己寫了一個啓動類,是這樣的:

 

 關注藍色選中部分,或許有人已經發現問題了。在準備部署的時候暴露了問題,準備用--spring.profiles.active={env}啓動命令切換配置文件時,怎麼試都無效,竟然是因爲這個run()方法我沒有將args參數傳遞進去,正確的寫法應該是這樣:

 要說壞還是這個run方法壞,後面那個參數是一個變長參數:

不傳的話就是一個空數組,也不報錯,如果項目不涉及一些啓動命令的話,不傳args還是開開心心的跑。可我之前真的沒有關注這個,拍破腦袋也想不到這個args和啓動命令參數有關啊,雖然兩者很容易聯繫到一起,都是參數嘛。今天踩了雷,所以決定把Spring Boot的啓動過程整體梳理一遍,就從這個壞壞的run()方法開始。

這個run()方法將主源類封裝爲數組調用了該類中另一個run()方法:

可知啓動的時候主源類可以有多個,SpringApplication也提供了添加主源類的方法:

被調用的run()方法可以看出來是分兩步,即:

1.new SpringApplication() 利用主源類primarySources初始化SpringApplication類

2.調用SpringApplication的run()方法啓動項目,並傳遞參數args,run()方法着實有點多容易亂。

這兩個過程需要詳細的總結,所以放在下篇,這篇先是拋出了一個生產中遇到的問題,然後帶着問題對Spring Boot啓動過程源碼擼了個開頭。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章