JAVA Spring Boot 自動配置實(shí)現(xiàn)原理詳解
引言
在使用ssm框架的時候,每每想要用到依賴的功能,都需要導(dǎo)入相關(guān)jar包,并且寫配置文件做相關(guān)的配置,當(dāng)然也可以不寫配置文件,用配置類來代替配置文件也可以。在使用springboot框架的時候,會發(fā)現(xiàn)只要引入相關(guān)依賴,然后直接使用就行了,往往沒有自己做什么配置,或者想要更改一些配置屬性,比如改端口號,只要在application.properties文件里做修改就可以了,而且所有的配置都在這里。這就是springboot的自動配置功能。那springboot到底做了什么神奇的事情,使得我們可以從“配置地獄”中解放呢?
主啟動類的注解@SpringBootApplication
我們創(chuàng)建一個springboot項(xiàng)目,會發(fā)現(xiàn)項(xiàng)目目錄很干凈,springboot框架唯一可能動手腳的地方就剩主啟動類了。主啟動類也很干凈,里面的SpringApplication.run()
方法會創(chuàng)建并返回IoC容器,spring項(xiàng)目就這樣跑起來了,嫌疑就落到了注解頭上。
點(diǎn)進(jìn)這個注解,發(fā)現(xiàn)其包含了三個注解,分別是@SpringBootConfiguration、@EnableAutoConfiguration
和@ComponentScan
,在進(jìn)一步,發(fā)現(xiàn)@SpringBootConfiguration
只是個@Configuration
,@ComponentScan
是組件掃描,而@EnableAutoConfiguration
一看就和自動配置有關(guān)系。
1、@SpringBootConfiguration
只是個@Configuration
2、@ComponentScan
組件掃描用
3、@EnableAutoConfiguration
點(diǎn)進(jìn)源碼,發(fā)現(xiàn)其代替了兩個注解,分別是@AutoConfigurationPackage
和@Import({AutoConfigurationImportSelector.class})
,我們分別來研究這兩個注解
3.1、@AutoConfigurationPackage
點(diǎn)進(jìn)源碼,發(fā)現(xiàn)其包含了@Import({Registrar.class}),再點(diǎn)進(jìn)去,發(fā)現(xiàn)是批量注冊組件,而默認(rèn)掃描路徑就是與主啟動類所在的包,也就是主啟動類坐在的包下面,所有的組件會被掃描注冊到IoC容器中。這就解釋了為什么要把自己的組件寫到與主啟動類同包下。
3.2、@Import({AutoConfigurationImportSelector.class})
點(diǎn)進(jìn)源碼,會發(fā)現(xiàn)這個也是批量組測組件,而注冊的組件在哪里呢?它會讀取一個配置文件,這個配置文件里寫了所有需要注冊的127個組件。我們會發(fā)現(xiàn),這些個組件就是springboot替我們寫的配置類。那么這些配置類在哪里呢?在spring-boot-autoconfigure-2.4.4.jar里面。這下明白springboot是從哪里自動導(dǎo)入配置類的了。
spring-boot-autoconfigure中的默認(rèn)配置類
這里面所有的配置類都會被自動注冊,但我們又不是會用到全部可能的功能,那這樣豈不是造成了浪費(fèi)?實(shí)際上,配置類可以使用@Conditional注解來根據(jù)條件決定自己是否注冊。我們?nèi)绻麤]有引入相關(guān)的依賴,@Conditional可能就會判斷出這個配置類不需要注冊。又或者我們自己寫了配置類,那@Conditional也可能會使這個配置類不注冊。
配置數(shù)據(jù)的綁定
那么所有的配置數(shù)據(jù)都可以在一個配置文件(既application.properties)中修改,是怎樣做到的呢?
是使用這幾個注解做到的:@EnableConfigurationProperties
和@ConfigurationProperties
,這兩個注解可以使我們在配置文件中寫的數(shù)據(jù)封裝到對應(yīng)的類里面,這樣配置類就能拿到我們寫的配置數(shù)據(jù)了。
SpringBoot實(shí)現(xiàn)自動配置的流程圖如下:
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JAVA 16位ID生成工具類含16位不重復(fù)的隨機(jī)數(shù)數(shù)字+大小寫
這篇文章主要介紹了JAVA 16位ID生成工具類含16位不重復(fù)的隨機(jī)數(shù)數(shù)字+大小寫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Java中volatile關(guān)鍵字的線程的可見性、有序性詳解
這篇文章主要介紹了Java中volatile關(guān)鍵字的線程的可見性、有序性詳解,在juc多線程并發(fā)編程中,常常需要關(guān)注線程的"可見性"與"有序性",本文將詳細(xì)介紹這兩部分內(nèi)容,以及volatile關(guān)鍵字的使用,需要的朋友可以參考下2024-01-01mybatis的mapper.xml中resultMap標(biāo)簽的使用詳解
這篇文章主要介紹了mybatis的mapper.xml中resultMap標(biāo)簽的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06IDEA提示:Boolean method ‘xxx‘ is always&nb
這篇文章主要介紹了IDEA提示:Boolean method ‘xxx‘ is always inverted問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08SpringBoot實(shí)現(xiàn)發(fā)送QQ郵件的示例代碼
這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)發(fā)送QQ郵件功能,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09關(guān)于@SpringBootApplication與@SpringBootTest的區(qū)別及用法
這篇文章主要介紹了關(guān)于@SpringBootApplication與@SpringBootTest的區(qū)別及用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01用JAVA實(shí)現(xiàn)單鏈表,檢測字符串是否是回文串
這篇文章主要介紹了使用JAVA實(shí)現(xiàn)單鏈表,檢測字符串是否是回文串,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11