SpringBoot的啟動入口就是一個非常簡單的run方法,這個run方法會加載一個應用所需要的所有資源和配置,最后啟動應用。
通過查看run方法的源碼,我們發現,run方法首先啟動了一個監聽器,然后創建了一個應用上下文ConfigurableApplicationContext,我們知道,context就是用來加載各種bean和環境配置等信息。
在context的初始化過程中,會調用一個load方法,將我們的啟動類當做參數(sources)傳進去,這個方法的主要作用就是加載應用所需的各種bean和資源配置。
load方法會創建一個BeanDefinitionLoader,由BeanDefinitionLoader的loader方法來執行具體的加載。
BeanDefinitionLoader的load方法根據所傳入的不同source類型來選擇不同的加載方式,前面說到,這整個過程之中,source里面就只有啟動類這一個對象,所以這里就將其強轉成Class并加載。
加載Class的方法里面調用了一個isComponent(Class> type)方法,這個方法便是用來判斷加載的類上有沒有注解的,如果有,就要開始解析注解了。
如此一來,啟動類上的@SpringBootApplication注解就會被調用,這個注解是實現SpringBoot自動配置功能的關鍵所在。
查看@SpringBootApplication的源碼,我們發現它實際上是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個注解的合集。其中@EnableAutoConfiguration是啟用自動配置的,并將導入一些自動配置的類定義;@ComponentScan用來加載應用中一些自定義的類。
@EnableAutoConfiguration最終會導入一個自動配置的類列表,這些類大多數都處于備用狀態。這邊是SpringBoot自動配置的秘密,它已經把你可能要用到的東西全都準備好了,一旦你引入了相關的jar包,對應的功能就會被啟用,應用啟動時,程序就會讀取相關的配置信息。程序首先會嘗試到配置文件中讀取相關的配置信息,如果配置文件中沒有,那么就會啟用配置的默認值。