帶著萌新看springboot原始碼11(springboot啟動原理 原始碼上)
通過前面這麼多講解,springboot原理應該也大概有個輪廓了,一些基本的配置,從客戶端url到controller(配置一些要用的元件,servlet三大元件,處理器對映器,攔截器,檢視解析器這些都說過了),然後通過Dao和資料庫打交道(配置資料來源、Druid監控都說了,其實我後面要寫的就是springboot和mybatis、springdata jpa的整合運用了),順便還說了一下spring中ioc容器的建立原理。
今天就來一點更好玩的東西,大家還記得最開始的那個主配置類吧(就是有main方法的那個)。對了,ioc容器建立還有不瞭解的出門左轉,可以看我前面幾次寫的文章。
溫馨提醒:這次原理涉及到ioc容器建立原理以及監聽器原理,我會跳過,因為前幾篇說過了,只說springboot有關的;而且不會使用除錯的小夥伴要先學會除錯哦~
隨便建立一個springboot應用(要包括web模組)
首先,我們就在這裡打個斷點
除錯,run方法裡面可以看到還是啥事沒做,繼續呼叫run方法,step into進入
可以看到,先根據主配置類建立一個spring應用(SpringApplication),然後呼叫run方法
我們看看是怎麼建立spring應用的
那我們來看看這兩個類似的方法做了一些什麼
是累路徑下所有的jar包下的META-INF/spring.factories檔案,我只是舉個例子,還有很多個這樣的xxxInitializer
同理,那兩個類似的的方法下面一個,就是載入所有類路徑下META-INF/spring.factories,鍵為ApplicationListener的所有類,然後儲存起來。
到這裡。spring應用就創建出來了,無非是載入所有的ApplicationContextInitializer對應的xxxInitializer 和 ApplicationRunListener對應的監聽器,都儲存起來
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面就開始執行run方法,看run方法裡面是怎麼執行的
主要來看看這七個步驟是幹了什麼
第一步
拿到所有監聽器,建立物件,然後儲存起來,再看第一步的start()方法,有關監聽器的原理在我的spring ioc原理我就說了(這裡的所有監聽器,在之前已經載入好了,都存起來了)
第二步
後面的就是監聽器的原理了,都一樣(貼一下監聽器接口裡面的方法)
第三步(建立ioc容器)
第四步
每個具體的xxxApplicationContextInitializer類的initialize()方法都不一樣,可以自己去看看,估計肯定是設定一些引數,往ioc容器裡匯入一些元件
第五步(重新整理容器,具體的我之前spring ioc原始碼那裡詳細的講解了,這裡就略過)
記住哦,這裡的獲取ioc容器由於在上面已經建立過了,所以會直接從上面獲取的
先到這裡,下一節繼續說一下後面一點內容