只爲記錄自己學習的知識總結分享,歡迎指正,共同學習提升。
廢話不多上圖:
創建一個Demo,進入到springboot主方法:
進入到@EnableAutoConfiguration利用@Import 註解將所有符合自動裝配的Bean注入到IOC容器中
進入到AutoConfigurationImportSelector 類,第一句判斷當前的系統是否禁用了自動裝配的功能,如果被禁用:private static final String[] NO_IMPORTS = {}; 返回一個空的數組,後續也就無法注入Bean了;SpringBoot通過該方法選擇性導入啓動時需要的組件;
進入getAutoConfigurationEntry()方法,我們主要關注116行;會給容器注入衆多的配置類,給容器導入這個場景需要的所有組件,並配置好這些組件;獲取候選配置選擇性加載,並返回AutoConfigurationEntry
我們點擊進去看進入到以下方法:
候選配置類獲取方法
再進入loadFactoryNames()方法
public static List loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
if (result != null) {
return result;
} else {
try {
//從類路徑的META-INF/spring.factories中加載所有默認的自動配置類
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
LinkedMultiValueMap result = new LinkedMultiValueMap();
while(urls.hasMoreElements()) {
URL url = (URL)urls.nextElement();
UrlResource resource = new UrlResource(url);
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
Iterator var6 = properties.entrySet().iterator();
while(var6.hasNext()) {
Entry<?, ?> entry = (Entry)var6.next();
//獲取EnableAutoConfiguration指定的所有值,也就是EnableAutoConfiguration.class的值
String factoryTypeName = ((String)entry.getKey()).trim();
String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
int var10 = var9.length;
for(int var11 = 0; var11 < var10; ++var11) {
String factoryImplementationName = var9[var11];
result.add(factoryTypeName, factoryImplementationName.trim());
}
}
}
cache.put(classLoader, result);
return result;
} catch (IOException var13) {
throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
}
}
}
Springboot啓動時會從類路徑下的META-INF/spring.factories中獲取到EnableAutoConfiguration指定的值,並將這些值作爲自動配置類導入容器中,自動配置類就會生效,最後完成自動配置工作,如下圖