SpringBoot自動配置分析(一)

2021-09-25 00:27:24 字數 2523 閱讀 3692

static class registrar implements importbeandefinitionregistrar, determinableimports
目光停留在getpackagename()上,獲取包名?打個斷點,debug一下。

這樣看不是很明白,結合我的專案的目錄樹看看就明白了。

原來所謂的包掃瞄就是把springboot應用的啟動類所在的包下所有的類掃瞄一遍。遇到@bean之類的就把它加入到容器中。

再看看@enableautoconfigura註解裡的@import(autoconfigurationimportselector.class)。直譯過來自動匯入選擇器。點進這個類看看。

protected autoconfigurationentry getautoconfigurationentry(

autoconfigurationmetadata autoconfigurationmetadata,

annotationmetadata annotationmetadata)

annotationattributes attributes = getattributes(annotationmetadata);

listconfigurations = getcandidateconfigurations(annotationmetadata,

attributes);

configurations = removeduplicates(configurations);

setexclusions = getexclusions(annotationmetadata, attributes);

checkexcludedclasses(configurations, exclusions);

configurations.removeall(exclusions);

configurations = filter(configurations, autoconfigurationmetadata);

fireautoconfigurationimportevents(configurations, exclusions);

return new autoconfigurationentry(configurations, exclusions);

}

這個方法名叫獲取自動配置實體,打幾個斷點debug一下。

可以看到configurations儲存了一大堆自動配置類的名稱。那麼這些東西是從**來的呢?繼續翻這個類的原始碼。可以看到confiurations通過getcandidateconfigurations(annotationmetadata,attributes)這個方法獲取值的。

protected listgetcandidateconfigurations(annotationmetadata metadata,

annotationattributes attributes)

點進loadfactorynames(getspringfactoriesloade***ctoryclass(), getbeanclassloader());這個方法。這個方法牽扯到兩個方法。

public static listloadfactorynames(class> factoryclass, @nullable classloader classloader) 

private static map> loadspringfactories(@nullable classloader classloader)

try

}} cache.put(classloader, result);

return result;

} catch (ioexception ex)

}

目光再次停留在factories_resource_location這個常量上。點進去看看到底是什麼。

public static final string factories_resource_location = "meta-inf/spring.factories";
結合上面的**,原來loadfactorynames(getspringfactoriesloade***ctoryclass(), getbeanclassloader());的作用是掃瞄所有jar包下的"meta-inf/spring.factories"檔案。所謂spring.factories檔案就是一系列的鍵值對。讀取每乙個spring.factories把鍵值存放在properties物件中。

Spring boot自動配置

1 從原始碼角度看spring boot 自動配置 這個方法呼叫的是 initialize sources suppresswarnings private void initialize object sources this.webenvironment deducewebenvironment...

Spring Boot 自動配置

在spring中假設我們要使用乙個資料來源,必須在配置datasource才能使用,但是使用了spring boot這些就不存在了,相當於spring boot為我們做了很多配置的工作。spring 4提供了乙個更通用的基於條件的bean的建立方式,即使用 conditional 實現conditi...

springboot自動配置

springboot 一.切換條件condition 1.配置類加 configuration,返回值為所需實體類的方法加 bean 2.實體類方法加 conditional x.class 3.類實現condition類重寫它的public boolean matches conditioncon...