点进去@SpringBootApplication,有以下几个注解
点击@EnableAutoConfiguration
最重要的是@Import导入的这个类
我们找到这个类的源码AutoConfigurationImportSelector.java
点进去看有这个方法
再点进去loadFactoryNames这个方法
再跟一下loadSpringFactories这个方法
由此发现urls是获取了所有的路径,什么路径呢,就是FACTORIES_RESOURCE_LOCATION的值的路径
下面这个方法加载了每个遍历的spring.factories的键值对
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
然后将spring.factories的键与对应的所有值放入到result
for (Map.Entry<?, ?> entry : properties.entrySet()) {
String factoryClassName = ((String) entry.getKey()).trim();
for (String factoryName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {
result.add(factoryClassName, factoryName.trim());
}
我在跟代码的时候发现result的size有问题,比如第一个spring.factories与第二个spring.factories的键加起来的数量与size的数量不一致,以为有条件过滤掉部分的键,其实不是,因为每个spring.factories中有相同的键,只是将值追加到键中了。
比如
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191014165607193.png
她两都有相同的键org.springframework.context.ApplicationContextInitializer。
后记
我在看一个博主分析源码的文章,与我有一处不同,就是@Import导入的类不同,
他那篇文导入的类是EnableAutoConfigurationImportSelector.class,而我的源码导入的是AutoConfigurationImportSelector.class
我又找了找那个类,发现并没有找到,我又找哪个类继承了AutoConfigurationImportSelector.class,发现
而他之中的
这个方法也与之前不同。所以说springboot版本问题,我的springboot是2.1.4,而那篇文章分析的源码应该是之前的版本。
附上那位博主的文章地址:https://www.cnblogs.com/wyq1995/p/9942147.html