SpringBoot是如何實(shí)現(xiàn)自動(dòng)配置的你知道嗎
SpringBoot啟動(dòng)類(lèi):
@SpringBootApplication public class CommunityApplication { public static void main(String[] args) { SpringApplication.run(CommunityApplication.class, args); } }
進(jìn)入@SpringBootApplication源碼中:
AutoConfigurationImportSelector 類(lèi)的作用就是往 Spring 容器中導(dǎo)入組件,我們?cè)龠M(jìn)入這個(gè)類(lèi)的源碼,發(fā)現(xiàn)有這幾個(gè)方法:
loadmetadata的方法是加載項(xiàng)目的基本配置數(shù)據(jù)信息。
而getAutoConfigurationEntry方法則是實(shí)現(xiàn)自動(dòng)裝配的邏輯,繼續(xù)點(diǎn)進(jìn)去
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
步驟如下:
1、首先注意到 selectImports 方法,這個(gè)方法用于給容器中導(dǎo)入組件,然后跳到 getAutoConfigurationEntry 方法,用于獲取自動(dòng)配置項(xiàng)。
2、再來(lái)進(jìn)入 getCandidateConfigurations 方法就是 獲取一個(gè)自動(dòng)配置 List ,這個(gè) List 就包含了所有的自動(dòng)配置的類(lèi)名 。
3、再進(jìn)入 SpringFactoriesLoader 類(lèi)的 loadFactoryNames 方法,跳轉(zhuǎn)到 loadSpringFactories 方法發(fā)現(xiàn) ClassLoader 類(lèi)加載器指定了一個(gè) FACTORIES_RESOURCE_LOCATION 常量。
4、然后利用 PropertiesLoaderUtils 把 ClassLoader 掃描到的這些文件的內(nèi)容包裝成 properties 對(duì)象,從 properties 中獲取到 EnableAutoConfiguration.class 類(lèi)(類(lèi)名)對(duì)應(yīng)的值,然后把他們添加在容器中。
打開(kāi)META-INF/spring.factories文件,EnableAutoConfiguration 有一個(gè) = 號(hào),= 號(hào)后面那一串就是這個(gè)項(xiàng)目需要用到的自動(dòng)配置類(lèi)。
追溯完成?。。?/p>
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java反射中java.beans包學(xué)習(xí)總結(jié)
本篇文章通過(guò)學(xué)習(xí)Java反射中java.beans包,吧知識(shí)點(diǎn)做了總結(jié),并把相關(guān)內(nèi)容做了關(guān)聯(lián),對(duì)此有需要的朋友可以學(xué)習(xí)參考下。2018-02-02IntelliJ IDEA 安裝及初次使用圖文教程(2020.3.2社區(qū)版)
這篇文章主要介紹了IntelliJ IDEA 安裝及初次使用(2020.3.2社區(qū)版),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03java實(shí)現(xiàn)隨機(jī)生成驗(yàn)證碼圖片
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)隨機(jī)生成驗(yàn)證碼圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Springboot使用Spring Data JPA實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作
Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 規(guī)范的基礎(chǔ)上開(kāi)發(fā)的一個(gè)框架,使用 Spring Data JPA 可以極大地簡(jiǎn)化JPA 的寫(xiě)法,本章我們將詳細(xì)介紹在Springboot中使用 Spring Data JPA 來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作2021-06-06maven依賴(lài)包沖突SLF4J:?Class?path?contains?multiple?SLF4J?bi
這篇文章主要給大家介紹了關(guān)于maven依賴(lài)包沖突SLF4J:?Class?path?contains?multiple?SLF4J?bindings的處理方法,這個(gè)問(wèn)題通常是因?yàn)轫?xiàng)目中存在多個(gè)SLF4J的實(shí)現(xiàn)綁定(bindings)導(dǎo)致的沖突,需要的朋友可以參考下2024-02-02mybatis plus實(shí)體類(lèi)中字段映射mysql中的json格式方式
這篇文章主要介紹了mybatis plus實(shí)體類(lèi)中字段映射mysql中的json格式方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java動(dòng)態(tài)設(shè)置注解值及原理詳解
這篇文章主要介紹了Java動(dòng)態(tài)設(shè)置注解值及原理詳解,AnnotationInvocationHandler是注解的代理hander,通過(guò)反射獲取類(lèi)的注解時(shí)會(huì)通過(guò)AnnotationInvocationHandler創(chuàng)建代理對(duì)象并將數(shù)據(jù)存儲(chǔ)到memberValues里,需要的朋友可以參考下2023-11-11