Java SpringBoot自動裝配原理詳解
自動裝配的含義
在SpringBoot程序main方法中,添加@SpringBootApplication或者@EnableAutoConfiguration會自動去maven中讀取每個starter中的spring.factories文件,該文件里配置了所有需要被創(chuàng)建的Spring容器中的bean;
如圖為springboot提供的starter自動配置:
springboot應(yīng)用程序啟動類
啟動類一般通過@SpringBootApplication一個注解即可完成所有啟動工作。
并且啟動類要在項(xiàng)目最外層:
@SpringBootApplication注解分析
SpringBootApplication注解之所以強(qiáng)大的原因是其內(nèi)部已經(jīng)注入了三個注解:
@SpringBootConfiguration
此注解實(shí)際上就是@Configuration注解,用來標(biāo)注配置類。
而@Configuration注解,內(nèi)部又有@Component注解, 意味也將會注冊為bean, 其內(nèi)部也可以依賴注入。
@ComponentScan
這個注解也是Spring中的,它用來將指定包下需要裝配的組件掃描出來注冊到容器中。
創(chuàng)建一個配置類,在配置類上添加 @ComponentScan 注解。該注解默認(rèn)會掃描該類所在的包下所有的配置類。
@EnableAutoConfiguration
此注解是自動裝配的核心注解, @EnableAutoConfiguration的內(nèi)部如圖,其中有注解@AutoConfigurationPackage和@Import兩個注解。
可以看到@Import注解內(nèi)有一個類AutoConfigurationImportSelector。這個類(implement ImportSelector),實(shí)現(xiàn)了selectImports() 方法,用來篩選被@Import的Configuration類(減去exclude等)。
@Override public String[] selectImports(AnnotationMetadata annotationMetadata) { // 如果AutoConfiguration沒開,返回{} if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } // 將spring-autoconfigure-metadata.properties的鍵值對配置載入到PropertiesAutoConfigurationMetadata對象中并返回 AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); // 基于各種配置計(jì)算需要import的configuration和exclusion AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); }
可見selectImports()
是AutoConfigurationImportSelector
的核心函數(shù),其核心功能就是獲取spring.factories
中EnableAutoConfiguration
所對應(yīng)的Configuration類列表,由@EnableAutoConfiguration
注解中的exclude/excludeName
參數(shù)篩選一遍,再由AutoConfigurationImportFilter
類所有實(shí)例篩選一遍,得到最終的用于Import的configuration和exclusion。
另外,還有一個注解@AutoConfigurationPackage
, @AutoConfigurationPackage注解的作用是將 添加該注解的類所在的package 作為 自動配置package 進(jìn)行管理,還有@AutoConfigurationPackage注解的主要作用就是將主程序類所在包及所有子包下的組件到掃描到spring容器中。
因此 在定義項(xiàng)目包結(jié)構(gòu)時(shí),要求定義的包結(jié)構(gòu)非常規(guī)范,項(xiàng)目主程序啟動類要定義在最外層的根目錄位置,然后在根目錄位置內(nèi)部建立子包和類進(jìn)行業(yè)務(wù)開發(fā),這樣才能夠保證定義的類能夠被組件掃描器掃描
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Spring?Boot項(xiàng)目抵御XSS攻擊實(shí)戰(zhàn)過程
XSS攻擊又稱跨站腳本攻擊,通常指利用網(wǎng)頁開發(fā)時(shí)留下的漏洞,通過巧妙的方法注入惡意指令代碼到網(wǎng)頁,使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁程序,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目抵御XSS攻擊的相關(guān)資料,需要的朋友可以參考下2022-11-11maven多個plugin相同phase的執(zhí)行順序
這篇文章主要介紹了maven多個plugin相同phase的執(zhí)行順序,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12如何用ObjectMapper將復(fù)雜Map轉(zhuǎn)換為實(shí)體類
這篇文章主要介紹了如何用ObjectMapper將復(fù)雜Map轉(zhuǎn)換為實(shí)體類的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Spring Boot 啟動加載數(shù)據(jù) CommandLineRunner的使用
本篇文章主要介紹了Spring Boot 啟動加載數(shù)據(jù) CommandLineRunner的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04SpringCloud Netfilx Ribbon負(fù)載均衡工具使用方法介紹
Ribbon是Netflix的組件之一,負(fù)責(zé)注冊中心的負(fù)載均衡,有助于控制HTTP和TCP客戶端行為。Spring Cloud Netflix Ribbon一般配合Ribbon進(jìn)行使用,利用在Eureka中讀取的服務(wù)信息,在調(diào)用服務(wù)節(jié)點(diǎn)時(shí)合理進(jìn)行負(fù)載2022-12-12泛型的類型擦除后fastjson反序列化時(shí)如何還原詳解
這篇文章主要為大家介紹了泛型的類型擦除后fastjson反序列化時(shí)如何還原詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11使用Spirng Boot Admin監(jiān)控Spring Cloud應(yīng)用項(xiàng)目
這篇文章主要介紹了使用Spirng Boot Admin監(jiān)控Spring Cloud應(yīng)用項(xiàng)目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05java讀取PHP接口數(shù)據(jù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨ava讀取PHP接口數(shù)據(jù)的實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08SpringBoot數(shù)據(jù)層測試事務(wù)回滾的實(shí)現(xiàn)流程
這篇文章主要介紹了SpringBoot數(shù)據(jù)層測試事務(wù)回滾的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10