Spring Boot深入原理 - SpringApplication啟動原理

來源:互聯網
上載者:User

標籤:started   generator   stopwatch   link   cms   發布   throws   blog   res   

Spring Boot深入原理 - SpringApplication啟動原理

我們知道,如果不需要特殊的配置,只需要在main方法裡調用SpringApplicatio.run()方法即可啟動Spring Boot應用:

  1. public static void main(String[] args) throws Exception {
  2. SpringApplication.run(Application.class, args);
  3. }

作為深入原理的第一篇,我們先來看下Spring Boot應用是怎麼啟動的。

SpringApplication啟動流程

SpringApplication的啟動過程非常複雜,下面是在調用SpringApplication.run方法之後啟動的關鍵動作:

既然要瞭解SpringApplication的啟動流程,第一步當然是進入源碼裡看看嘍:

  1. public ConfigurableApplicationContext run(String... args) {
  2. StopWatch stopWatch = new StopWatch();
  3. stopWatch.start();
  4. ConfigurableApplicationContext context = null;
  5. FailureAnalyzers analyzers = null;
  6. configureHeadlessProperty();
  7. //初始化監聽器
  8. SpringApplicationRunListeners listeners = getRunListeners(args);
  9. //發布ApplicationStartedEvent
  10. listeners.starting();
  11. try {
  12. //裝配參數和環境
  13. ApplicationArguments applicationArguments = new DefaultApplicationArguments(
  14. args);
  15. ConfigurableEnvironment environment = prepareEnvironment(listeners,
  16. applicationArguments);
  17. //列印Banner
  18. Banner printedBanner = printBanner(environment);
  19. //建立ApplicationContext()
  20. context = createApplicationContext();
  21. analyzers = new FailureAnalyzers(context);
  22. //裝配Context
  23. prepareContext(context, environment, listeners, applicationArguments,
  24. printedBanner);
  25. //refreshContext
  26. refreshContext(context);
  27. //afterRefresh
  28. afterRefresh(context, applicationArguments);
  29. //發布ApplicationReadyEvent
  30. listeners.finished(context, null);
  31. stopWatch.stop();
  32. if (this.logStartupInfo) {
  33. new StartupInfoLogger(this.mainApplicationClass)
  34. .logStarted(getApplicationLog(), stopWatch);
  35. }
  36. return context;
  37. }
  38. catch (Throwable ex) {
  39. handleRunFailure(context, listeners, analyzers, ex);
  40. throw new IllegalStateException(ex);
  41. }
  42. }
第一步,初始化監聽器

這裡會初始化Spring Boot內建的監聽器,以及添加到SpringApplication的自訂監聽器。

初始化監聽器的調用關係很深,為了節省篇幅,就不貼源碼了,稍後用專門的文章細聊。

第二步,發布ApplicationStartedEvent事件

到這一步,Spring Boot會發布一個ApplicationStartedEvent事件。如果你想在這個時候執行一些代碼可以通過實現ApplicationListener介面實現;

下面是ApplicationListener介面的定義,注意這裡有個<E extends ApplicationEvent>

  1. public interface ApplicationListener<E extends ApplicationEvent> extends EventListener

例如,你想監聽ApplicationStartedEvent事件,你可以這樣定義:

  1. public class ApplicationStartedListener implements ApplicationListener<ApplicationStartedEvent>

然後通過SpringApplication.addListener(..)添加進去即可。

第三步,裝配參數和環境

在這一步,首先會初始化參數,然後裝配環境,確定是web環境還是非web環境。

第四步,發布ApplicationEnvironmentPreparedEvent事件

準確的說,這個應該屬於第三步,在裝配完環境後,就觸發ApplicationEnvironmentPreparedEvent事件。如果想在這個時候執行一些代碼,可以訂閱這個事件的監聽器,方法同第二步。

第五步,列印Banner

看過Spring Boot執行個體教程 - 自訂Banner的同學會很熟悉,啟動的Banner就是在這一步列印出來的。

第六步,建立ApplicationContext

這裡會根據是否是web環境,來決定建立什麼類型的ApplicationContext,ApplicationContext不要多說了吧,不知道ApplicationContext是啥的同學,出門左轉補下Spring基礎知識吧。

第七步,裝配Context

這裡會設定Context的環境變數、註冊Initializers、beanNameGenerator等。

第八步,發布ApplicationPreparedEvent事件

這裡放在第七步會更準確,因為這個是在裝配Context的時候發布的。

值得注意的是:這裡是假的,假的,假的,源碼中是空的,並沒有真正發布ApplicationPreparedEvent事件。不知道作者這麼想的???

第九步,註冊、載入等

註冊springApplicationArguments、springBootBanner,載入資源等。

第十步,發布ApplicationPreparedEvent事件

注意,到這裡才是真正發布了ApplicationPreparedEvent事件。這裡和第八步好讓人誤解。

第十一步,refreshContext

裝配context beanfactory等非常重要的核心組件。

第十二步,afterRefreshContext

這裡會調用自訂的Runners,不知道Runners是什麼的同學,請參考Spring Boot官方文檔 - SpringApplication

第十三步,發布ApplicationReadyEvent事件

最後一步,發布ApplicationReadyEvent事件,啟動完畢,表示服務已經可以開始正常提供服務了。通常我們這裡會監聽這個事件來列印一些監控性質的日誌,表示應用正常啟動了。添加方法同第二步。

注意:如果啟動失敗,這一步會發布ApplicationFailedEvent事件。

到這裡,Spring Boot啟動的一些關鍵動作就介紹完了。

總結

說是深入,本篇文章更像是一個概括性的介紹。因為每個關鍵動作內容都很多,都很值得深入研究,都放在這裡顯然空間太小,接下來將會分章節深入每個關鍵動作。

 

Spring Boot深入原理 - SpringApplication啟動原理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.