springboot啟動流程簡單總結


Spring Boot程序有一個入口,就是main方法。main里面調用SpringApplication.run()啟動整個Spring Boot程序,該方法所在類需要使用@SpringBootApplication復合注解。

其中需要關注的是:

@SpringBootApplication注解其實是包含了三個注解:

(1)@EnableAutoConfiguration:SpringBoot根據應用所聲明的依賴來對Spring框架進行自動配置。簡單概括一下就是,是借助@Import的幫助,將所有符合自動配置條件的bean定義加載到IoC容器。

(2)@Configuration:它就是JavaConfig形式的Spring Ioc容器的配置類。被標注的類等於在spring的XML配置文件中(applicationContext.xml),裝配所有bean事務,提供了一個spring的上下文環境。

(3)@ComponentScan:組件掃描,可自動發現和裝配Bean,功能其實就是自動掃描並加載符合條件的組件或者bean定義,最終將這些bean定義加載到IoC容器中。


二:詳細解釋:

1、SpringBoot啟動的時候,會構造一個SpringApplication的實例,然后調用這個實例的run方法,在run方法調用之前,也就是構造SpringApplication的時候會進行初始化的工作,初始化的時候會做以下幾件事:

(1)把參數sources設置到SpringApplication屬性中,這個sources可以是任何類型的參數.
(2)判斷是否是web程序,並設置到webEnvironment的boolean屬性中.
(3)創建並初始化ApplicationInitializer,設置到initializers屬性中 。
(4)創建並初始化ApplicationListener,設置到listeners屬性中 。
(5)初始化主類mainApplicatioClass。

源代碼:

    private void initialize(Object[] sources) {
          if (sources != null && sources.length > 0) {
              //把sources設置到SpringApplication的sources屬性中,目前只是一個MyApplication類對象
            this.sources.addAll(Arrays.asList(sources)); 
          }
              //判斷是否是web程序,並設置到webEnvironment的boolean屬性中
          this.webEnvironment = deduceWebEnvironment(); 
              //找出所有的初始化器,默認有5個,設置到initializers屬性中 。
          setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
              //找出所有的應用程序監聽器,默認有9個,設置到listeners屬性中 。
          setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
              //找出運行的主類(main class)
          this.mainApplicationClass = deduceMainApplicationClass();
        }

2、SpringApplication構造完成之后調用run方法,啟動SpringApplication,run方法執行的時候會做以下幾件事:

(1)構造一個StopWatch計時器,觀察SpringApplication的執行 。
(2)獲取SpringApplicationRunListeners並封裝到SpringApplicationRunListeners中啟動,用於監聽run方法的執行。
(3)創建並初始化ApplicationArguments,獲取run方法傳遞的args參數。
(4)創建並初始化ConfigurableEnvironment(環境配置)。
(5)打印banner(只用在Classpath下添加字符文件圖標,就可以在啟動時候打印)。
(3)構造Spring容器(ApplicationContext)上下文。
(4)SpringApplicationRunListeners發布finish事件。
(5)StopWatch計時器停止計時。

如果想要深入看詳細的步驟,建議去網上搜索,很多作者都寫了細節的部分。

可以參考我認為寫的不錯的兩篇文章:

https://blog.csdn.net/u014252478/article/details/88789852?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3

https://blog.csdn.net/m0_37962779/article/details/78957309?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM