SpringBoot中的所有AutoConfiguration類載入原始碼
阿新 • • 發佈:2019-02-20
在SpringBoot中,有許多的AutoConfiguration類,例如RedisAutoConfiguration,DubboAutoConfiguration等,這個類,並不在@SpringBootApplication的掃描路徑中,那麼這些類的配置是怎麼生效的呢,下面我們跟著原始碼看下。
一、入口
在這個方法的最後一行程式碼就是入口:
processDeferredImportSelectors();
其實,這裡面是用了@SpringBootApplication註解中的@EnableAutoConfiguration註解中的
關於這個AutoConfigurationImportSelector類是在我們以前分析@Configuration註解的時候載入進去的:
// Process any @Import annotations
processImports(configClass, sourceClass, getImports(sourceClass), true);
通過這個這個方法,就是將@SpringBootApplication註解上的@EnableAutoConfiguration註解上的AutoConfigurationImportSelector類解析使用了。
二、過程
接著我們繼續返回方法processDeferredImportSelectors() ,這個方法中呼叫了getImports()方法,這個方法如下:
然後後面再group.process方法中,進入了方法:public Iterable<Group.Entry> getImports() { for (DeferredImportSelectorHolder deferredImport : this.deferredImports) { this.group.process(deferredImport.getConfigurationClass().getMetadata(), deferredImport.getImportSelector()); } return this.group.selectImports(); }
selector.selectImports(metadata)
這個selector就是我們之前獲取的AutoConfigurationImportSelector。然後進入了這個類的核心方法:getCandidateConfigurations。
這個程式碼我們很熟悉,SpringFactoriesLoader就是載入Spring.factories檔案中的類,這個載入的型別是:protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List<String> configurations = SpringFactoriesLoader.loadFactoryNames( getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you " + "are using a custom packaging, make sure that file is correct."); return configurations; }
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
通過這個方式我們就把所有spring.factories中的所有AutoConfiguration載入進來了。