JAVA Spring Boot 自動配置實現原理詳解

引言

在使用ssm框架的時候,每每想要用到依賴的功能,都需要導入相關jar包,並且寫配置文件做相關的配置,當然也可以不寫配置文件,用配置類來代替配置文件也可以。在使用springboot框架的時候,會發現隻要引入相關依賴,然後直接使用就行瞭,往往沒有自己做什麼配置,或者想要更改一些配置屬性,比如改端口號,隻要在application.properties文件裡做修改就可以瞭,而且所有的配置都在這裡。這就是springboot的自動配置功能。那springboot到底做瞭什麼神奇的事情,使得我們可以從“配置地獄”中解放呢?

主啟動類的註解@SpringBootApplication

我們創建一個springboot項目,會發現項目目錄很幹凈,springboot框架唯一可能動手腳的地方就剩主啟動類瞭。主啟動類也很幹凈,裡面的SpringApplication.run()方法會創建並返回IoC容器,spring項目就這樣跑起來瞭,嫌疑就落到瞭註解頭上。

點進這個註解,發現其包含瞭三個註解,分別是@SpringBootConfiguration、@EnableAutoConfiguration@ComponentScan,在進一步,發現@SpringBootConfiguration隻是個@Configuration@ComponentScan是組件掃描,而@EnableAutoConfiguration一看就和自動配置有關系。

1、@SpringBootConfiguration

隻是個@Configuration

2、@ComponentScan

組件掃描用

3、@EnableAutoConfiguration

點進源碼,發現其代替瞭兩個註解,分別是@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class}),我們分別來研究這兩個註解

3.1、@AutoConfigurationPackage

點進源碼,發現其包含瞭@Import({Registrar.class}),再點進去,發現是批量註冊組件,而默認掃描路徑就是與主啟動類所在的包,也就是主啟動類坐在的包下面,所有的組件會被掃描註冊到IoC容器中。這就解釋瞭為什麼要把自己的組件寫到與主啟動類同包下。

3.2、@Import({AutoConfigurationImportSelector.class})

點進源碼,會發現這個也是批量組測組件,而註冊的組件在哪裡呢?它會讀取一個配置文件,這個配置文件裡寫瞭所有需要註冊的127個組件。我們會發現,這些個組件就是springboot替我們寫的配置類。那麼這些配置類在哪裡呢?在spring-boot-autoconfigure-2.4.4.jar裡面。這下明白springboot是從哪裡自動導入配置類的瞭。

spring-boot-autoconfigure中的默認配置類

這裡面所有的配置類都會被自動註冊,但我們又不是會用到全部可能的功能,那這樣豈不是造成瞭浪費?實際上,配置類可以使用@Conditional註解來根據條件決定自己是否註冊。我們如果沒有引入相關的依賴,@Conditional可能就會判斷出這個配置類不需要註冊。又或者我們自己寫瞭配置類,那@Conditional也可能會使這個配置類不註冊。

配置數據的綁定

那麼所有的配置數據都可以在一個配置文件(既application.properties)中修改,是怎樣做到的呢?

是使用這幾個註解做到的:@EnableConfigurationProperties@ConfigurationProperties,這兩個註解可以使我們在配置文件中寫的數據封裝到對應的類裡面,這樣配置類就能拿到我們寫的配置數據瞭。

SpringBoot實現自動配置的流程圖如下:

在這裡插入圖片描述

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: