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的更多內容!
推薦閱讀:
- java進階之瞭解SpringBoot的配置原理
- 詳解SpringBoot自動配置源碼
- SpringBoot自動配置特點與原理詳細分析
- Java經典面試題匯總:Spring Boot
- SpringBoot自動配置原理,你真的懂嗎?(簡單易懂)