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...