1. 程式人生 > >SpringBoot中的所有AutoConfiguration類載入原始碼

SpringBoot中的所有AutoConfiguration類載入原始碼

在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()方法,這個方法如下:

		public Iterable<Group.Entry> getImports() {
			for (DeferredImportSelectorHolder deferredImport : this.deferredImports) {
				this.group.process(deferredImport.getConfigurationClass().getMetadata(),
						deferredImport.getImportSelector());
			}
			return this.group.selectImports();
		}
然後後面再group.process方法中,進入了方法:
selector.selectImports(metadata)

這個selector就是我們之前獲取的AutoConfigurationImportSelector。然後進入了這個類的核心方法:getCandidateConfigurations。

	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;
	}
這個程式碼我們很熟悉,SpringFactoriesLoader就是載入Spring.factories檔案中的類,這個載入的型別是:
	protected Class<?> getSpringFactoriesLoaderFactoryClass() {
		return EnableAutoConfiguration.class;
	}
通過這個方式我們就把所有spring.factories中的所有AutoConfiguration載入進來了。