只为记录自己学习的知识总结分享,欢迎指正,共同学习提升。
废话不多上图:
创建一个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指定的值,并将这些值作为自动配置类导入容器中,自动配置类就会生效,最后完成自动配置工作,如下图