SpringBoot自動(dòng)裝配原理以及分析
先看看SpringBoot的主配置類(lèi)
里面有一個(gè)main方法運(yùn)行了一個(gè)run()方法,在run方法中必須要傳入一個(gè)被@SpringBootApplication注解的類(lèi)。
@SpringBootApplication
SpringBoot應(yīng)用標(biāo)注在某個(gè)類(lèi)上說(shuō)明這個(gè)類(lèi)是SpringBoot的主配置類(lèi),SpringBoot就會(huì)運(yùn)行這個(gè)類(lèi)的main方法來(lái)啟動(dòng)SpringBoot項(xiàng)目。
那@SpringBootApplication注解到底是什么呢,點(diǎn)進(jìn)去看看:
發(fā)現(xiàn)@SpringBootApplication是一個(gè)組合注解。
@SpringBootConfiguration
先看看@SpringBootConfiguration注解
這個(gè)注解很簡(jiǎn)單,表明該類(lèi)是一個(gè)Spring的配置類(lèi)。
再進(jìn)去看看@Configuration
說(shuō)明Spring的配置類(lèi)也是Spring的一個(gè)組件。
@EnableAutoConfiguration
這個(gè)注解是開(kāi)啟自動(dòng)配置的功能。
先看看@AutoConfigurationPackage注解
這個(gè)注解是自動(dòng)配置包,主要是使用的@Import來(lái)給Spring容器中導(dǎo)入一個(gè)組件 ,這里導(dǎo)入的是Registrar.class。
來(lái)看下這個(gè)Registrar
就是通過(guò)這個(gè)方法獲取掃描的包路徑,可以debug看看:
在這行代碼上打了一個(gè)斷點(diǎn)
啟動(dòng)項(xiàng)目
進(jìn)入斷點(diǎn)處
看看能否獲取掃描的包路徑
已經(jīng)獲取到了包路徑
那那個(gè)metadata是什么呢?
可以看到是標(biāo)注在@SpringBootApplication注解上的DemosbApplication,也就是我們的主配置類(lèi):
說(shuō)白了就是將主配置類(lèi)(即@SpringBootApplication標(biāo)注的類(lèi))的所在包及子包里面所有組件掃描加載到Spring容器。
所以包名一定要注意。
現(xiàn)在包掃描路徑獲取到了,那具體加載哪些組件呢,看看下面這個(gè)注解。
@Import({AutoConfigurationImportSelector.class})
@Import注解就是給Spring容器中導(dǎo)入一些組件,這里傳入了一個(gè)組件的選擇器:AutoConfigurationImportSelector。
里面有一個(gè)selectImports方法,將所有需要導(dǎo)入的組件以全類(lèi)名的方式返回;這些組件就會(huì)被添加到容器中。
debug運(yùn)行看看
會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類(lèi)(xxxAutoConfiguration);就是給容器中導(dǎo)入這個(gè)場(chǎng)景需要的所有組件,并配置好這些組件:
有了自動(dòng)配置類(lèi),免去了我們手動(dòng)編寫(xiě)配置注入功能組件等的工作。
那他是如何獲取到這些配置類(lèi)的呢,看看上面這個(gè)方法:
會(huì)從META-INF/spring.factories中獲取資源,然后通過(guò)Properties加載資源:
Spring Boot在啟動(dòng)的時(shí)候從類(lèi)路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動(dòng)配置類(lèi)導(dǎo)入到容器中,自動(dòng)配置類(lèi)就生效,幫我們進(jìn)行自動(dòng)配置工作。
以前我們需要自己配置的東西,自動(dòng)配置類(lèi)都幫我們完成了。
J2EE的整體整合解決方案和自動(dòng)配置都在spring-boot-autoconfigure-2.0.3.RELEASE.jar:
比如看看WebMvcAutoConfiguration
都已經(jīng)幫我們配置好了,我們不用再單獨(dú)配置了:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解spring+springmvc+mybatis整合注解
本篇文章主要介紹了詳解spring+springmvc+mybatis整合注解,詳細(xì)的介紹了ssm框架的使用,具有一定的參考價(jià)值,有興趣的可以了解一下2017-04-04springboot如何查找配置文件路徑的順序和其優(yōu)先級(jí)別
此文是在工作中遇到的關(guān)于springboot配置文件的問(wèn)題,在網(wǎng)上查閱資料和自己測(cè)試之后記錄的,以便日后查閱。希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請(qǐng)求日志
這篇文章主要介紹了Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請(qǐng)求日志的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07MyBatis中${}?和?#{}?有什么區(qū)別小結(jié)
${}?和?#{}?都是?MyBatis?中用來(lái)替換參數(shù)的,它們都可以將用戶傳遞過(guò)來(lái)的參數(shù),替換到?MyBatis?最終生成的?SQL?中,但它們區(qū)別卻是很大的,今天通過(guò)本文介紹下MyBatis中${}?和?#{}?有什么區(qū)別,感興趣的朋友跟隨小編一起看看吧2022-11-11