首先关注的是启动类

在该方法上打上断点调试接下来执行的过程
点击进入run方法中加载源文件 就是这个主启动类

继续点进去

发现new了一个SpringApplication对象,点进去这个对象发现有一系列的方法

其中最重要的是这两行代码
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));这两行代码主要做的就是 设置初始化,设置监听器 点击进入第一个方法

发现一个重要的方法,loadFactoryNames
继续走下去

loadSpringFactories方法的功能是从默认的spring.factories文件中加载,这个文件存放的很多类的全限定类名,保存为properties文件,然后读取
private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {
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);
}
}
}
从springfactory中读取初始化类和监听器,取出了类的全限定类名
版权声明:本文为weixin_47277897原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。