springboot 大體啓動流程

SpringApplication的run方法的實現是咱們本次旅程的主要線路,該方法的主要流程大致能夠概括以下:web

1) 若是咱們使用的是SpringApplication的靜態run方法,那麼,這個方法裏面首先要建立一個SpringApplication對象實例,而後調用這個建立好的SpringApplication的實例方法。在SpringApplication實例初始化的時候,它會提早作幾件事情:spring

  • 根據classpath裏面是否存在某個特徵類(org.springframework.web.context.ConfigurableWebApplicationContext)來決定是否應該建立一個爲Web應用使用的ApplicationContext類型。
  • 使用SpringFactoriesLoader在應用的classpath中查找並加載全部可用的ApplicationContextInitializer。
  • 使用SpringFactoriesLoader在應用的classpath中查找並加載全部可用的ApplicationListener。
  • 推斷並設置main方法的定義類。

2) SpringApplication實例初始化完成而且完成設置後,就開始執行run方法的邏輯了,方法執行伊始,首先遍歷執行全部經過SpringFactoriesLoader能夠查找到並加載的SpringApplicationRunListener。調用它們的started()方法,告訴這些SpringApplicationRunListener,「嘿,SpringBoot應用要開始執行咯!」。app

3) 建立並配置當前Spring Boot應用將要使用的Environment(包括配置要使用的PropertySource以及Profile)。spa

4) 遍歷調用全部SpringApplicationRunListener的environmentPrepared()的方法,告訴他們:「當前SpringBoot應用使用的Environment準備好了咯!」。對象

5) 若是SpringApplication的showBanner屬性被設置爲true,則打印banner。blog

6) 根據用戶是否明確設置了applicationContextClass類型以及初始化階段的推斷結果,決定該爲當前SpringBoot應用建立什麼類型的ApplicationContext並建立完成,而後根據條件決定是否添加ShutdownHook,決定是否使用自定義的BeanNameGenerator,決定是否使用自定義的ResourceLoader,固然,最重要的,將以前準備好的Environment設置給建立好的ApplicationContext使用。事件

7) ApplicationContext建立好以後,SpringApplication會再次藉助Spring-FactoriesLoader,查找並加載classpath中全部可用的ApplicationContext-Initializer,而後遍歷調用這些ApplicationContextInitializer的initialize(applicationContext)方法來對已經建立好的ApplicationContext進行進一步的處理。it

8) 遍歷調用全部SpringApplicationRunListener的contextPrepared()方法。io

9) 最核心的一步,將以前經過@EnableAutoConfiguration獲取的全部配置以及其餘形式的IoC容器配置加載到已經準備完畢的ApplicationContext。class

10) 遍歷調用全部SpringApplicationRunListener的contextLoaded()方法。

11) 調用ApplicationContext的refresh()方法,完成IoC容器可用的最後一道工序。

12) 查找當前ApplicationContext中是否註冊有CommandLineRunner,若是有,則遍歷執行它們。

13) 正常狀況下,遍歷執行SpringApplicationRunListener的finished()方法、(若是整個過程出現異常,則依然調用全部SpringApplicationRunListener的finished()方法,只不過這種狀況下會將異常信息一併傳入處理)

去除事件通知點後,整個流程以下:

總結

相關文章
相關標籤/搜索