SpringBootApplication含有注解
部分注解解析
SpringBootConfiguration
具有Configuration注解,说明此类被注入Ioc容器中
EnableAutoConfiguration
注解EnableAutoConfiguration具有一个import注解,引入AutoConfigurationImportSelector类
在该类下,其中有一个主要方法叫做getCandidateConfigurations,其中有一个调用SpringFactoriesLoader中的静态方法loadFactoryNames
点进去看一下,其中主要调用了两个主要方法loadFactoryNames与loadSpringFactories
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
ClassLoader classLoaderToUse = classLoader;
if (classLoader == null) {
classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
}
String factoryTypeName = factoryType.getName();
//通过反射获取名称
return (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
}
private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {
//以名称作为key开一个map,value为META-INF/spring.factories下所有类的地址的名称的链表
Map<String, List<String>> result = (Map)cache.get(classLoader);
if (result != null) {
return result;
} else {
HashMap result = new HashMap();
try {
Enumeration urls = classLoader.getResources("META-INF/spring.factories");
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();
String factoryTypeName = ((String)entry.getKey()).trim();
String[] factoryImplementationNames = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
String[] var10 = factoryImplementationNames;
int var11 = factoryImplementationNames.length;
for(int var12 = 0; var12 < var11; ++var12) {
String factoryImplementationName = var10[var12];
((List)result.computeIfAbsent(factoryTypeName, (key) -> {
return new ArrayList();
})).add(factoryImplementationName.trim());
}
}
}
result.replaceAll((factoryType, implementations) -> {
return (List)implementations.stream().distinct().collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
});
cache.put(classLoader, result);
return result;
} catch (IOException var14) {
throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var14);
}
}
}
也就是说,调用此方法,可以去加载META-INF/spring.factories下所有的java类。打开springboot-autoconfig中的META-INF/spring.factories
随意点开一个发现是一个javaConfig
那么springboot就可以通过这种方式,达到了所需的条件,加载所有理论上所需要的所有文件,从而我们不需要再通过手动去将一个一个bean加载到spring容器中。
我们发现,如果我们不在maven中添加我们所需要的东西,也还是无法使用。
其中设定就是在于各种的conditionxxx注解
如果无法满足他的条件,springboot就不会将这个bean加入到容器中,因此我们只要去maven中导入我们所需要的东西,满足了这个注解的需要,就可以实现自动装配!