2019獨角獸企業重金招聘Python工程師標準>>>
本文會通過分析上一篇中跑起來的示例程序來分析一下Spring Boot程序運行的基本原理。
概要
在上一篇的介紹中,程序是通過SpringBoot1HelloworldApplication.main()
方法運行起來的:
public static void main(String[] args) {SpringApplication.run(SpringBoot1HelloworldApplication.class, args);
}
從代碼中可以看到,通過SpringApplication.run
,這樣一個靜態方法,非常便捷地啟動了一個Spring程序。SpringApplication
這個類實際上就是一個Spring Boot應用的起點,每一個Spring Boot的應用都會有一個類似的啟動類,而run
方法的實際的作用是初始化了一個Spring容器的上下文。下面我們來分析一下這個簡單的應用是如何啟動起來的。
思考
按照以往使用Spring Framework的經驗,初始化一個Spring容器,需要讀取一些配置信息,但是在我們這個示例程序里面是沒有做任何配置的,先看一下源碼。
源碼分析
從SpringApplication.run()方法一路追蹤,看到下面的一個運行的過程:
上面的源碼最下面的紅框中在加載META-INF下面的spring.factories
文件,然后我們看到有很幾個包里面都帶這個文件,我們主要關注一下spring-boot-autoconfigure
這個包下面的。
大致內容示例如下:
可以看出,這個文件基本上都是定義一些Initializer
和Listener
這些定義都會在SpringApplication。run
啟動的時候進行加載。這些內容加載之后有什么用呢,以上圖中紅框對應的org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
進行舉例說明,先看一下該類的源碼:
簡單理解一下這個類上的幾個注解:
- @Configuration 本類是一個Spring的配置類
- @ConditionalOnClass({ RabbitTemplate.class, Channel.class }) 類路徑中有注解中的兩個類則加載本配置
- @EnableConfigurationProperties(RabbitProperties.class) 加載注解類中對應的配置類
到這里我們大概就知道了這個spring.factories
配置文件其實就是定義了一些Spring啟動需要的監聽以及Spring Boot 啟動是的默認配置,這樣就能達到在不做任何配置的情況下,啟用Spring Boot提供的默認配置來啟動程序。
SpringApplication運行及自動配置總結
簡單總結一下:
- 每個Spring Boot 程序都包括一個main函數來運行SpringApplication.run(),進行系統啟動。(目前可以這么認為)
- 這個run方法里面會初始化一個Spring的容器,初始化的內容都在項目及各個jar文件的META-INF下面的
spring.factories
中定義的各個配置類、監聽等等。 - 每個自動配置類都是基于條件進行加載的,即我們在項目中引入某些包之后,不添加配置或者少量必需配置后即可使用該包的功能。
歡迎關注我的微信公眾號: