-
}
-
try {
-
// 类加载器对象存在则用这个加载器获取上面说的常量路径里的资源,不存在则用系统类加载器去获取
-
Enumeration<URL> urls = (classLoader != null ?
-
classLoader.getResources(FACTORIES_RESOURCE_LOCATION) ://当前classloader是appclassloader,getResources能获取所有依赖jar里面的META-INF/spring.factories的完整路径
-
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
-
result = new LinkedMultiValueMap<>();
-
while (urls.hasMoreElements()) { // 遍历上述返回的url集合
-
URL url = urls.nextElement(); // URL类可以获取来自流,web,甚至jar包里面的资源
-
UrlResource resource = new UrlResource(url);
-
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
-
for (Map.Entry<?, ?> entry : properties.entrySet()) { // 解析spring.factories文件
-
List<String> factoryClassNames = Arrays.asList(
-
StringUtils.commaDelimitedListToStringArray((String) entry.getValue()));
-
// spring.facories中配置的不仅仅有自动配置相关的内容,还有其他比如ApplicationContextInitializer等等各种springboot启动的时候,初始化spring环境需要的配置,自动配置只是其中一项。这个cache也是在springboot启动阶段赋值的
-
result.addAll((String) entry.getKey(), factoryClassNames);
-
}
-
}
-
cache.put(classLoader, result);
-
return result;
-
}
-
catch (IOException ex) {
-
throw new IllegalArgumentException("Unable to load factories from location [" +
SpringBoot自动配置原理及手动实现自动配置
最新推荐文章于 2024-09-08 23:03:17 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)