public class My1JsonPropertySourceLoader implements org.springframework.boot.env.PropertySourceLoader {
@Override
public String[] getFileExtensions() {
return new String[]{"json"};
}
@Override
public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
return null;
}
}
public class My2JsonPropertySourceLoader implements org.springframework.boot.env.PropertySourceLoader {
@Override
public String[] getFileExtensions() {
return new String[]{"json"};
}
@Override
public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
return null;
}
}
Q: 按加载顺序?就看哪个类先被 classLoader 先加载?
1
7911364440 2023-01-06 09:44:48 +08:00
打印下日志不就知道了吗
|
2
JinTianYi456 OP @7911364440 #1 我不是要知道它具体调用的是哪个,而是想知道存在那么多个 PropertySourceLoader ,是如何排序的还是无序的?
|
3
RedBeanIce 2023-01-06 13:21:46 +08:00
这个对象好像蛮复杂的,之前 debug 时,也对这个对象不是很熟悉。
|
4
damai0419 2023-01-06 13:45:48 +08:00
https://docs.spring.io/spring-boot/docs/2.4.13/reference/html/spring-boot-features.html#boot-features-external-config
第二节 2. Externalized Configuration 的总述,应该就是你需要的内容。 |
5
9fan 2023-01-06 15:08:53 +08:00 1
public StandardConfigDataLocationResolver(Log logger, Binder binder, ResourceLoader resourceLoader) {
this.logger = logger; // 这行代码里面有你想要的答案,不过最终是有排序的,可使用注解 order 进行操控顺序 this.propertySourceLoaders = SpringFactoriesLoader.loadFactories(PropertySourceLoader.class, getClass().getClassLoader()); this.configNames = getConfigNames(binder); this.resourceLoader = new LocationResourceLoader(resourceLoader); } public static <T> List<T> loadFactories(Class<T> factoryType, @Nullable ClassLoader classLoader) { Assert.notNull(factoryType, "'factoryType' must not be null"); ClassLoader classLoaderToUse = classLoader; if (classLoaderToUse == null) { classLoaderToUse = SpringFactoriesLoader.class.getClassLoader(); } List<String> factoryImplementationNames = loadFactoryNames(factoryType, classLoaderToUse); if (logger.isTraceEnabled()) { logger.trace("Loaded [" + factoryType.getName() + "] names: " + factoryImplementationNames); } List<T> result = new ArrayList<>(factoryImplementationNames.size()); for (String factoryImplementationName : factoryImplementationNames) { result.add(instantiateFactory(factoryImplementationName, factoryType, classLoaderToUse)); } // 这里会作排序 AnnotationAwareOrderComparator.sort(result); return result; } |
6
9fan 2023-01-06 15:10:11 +08:00
不知道怎么发图片,自己看了,也觉得难受,自己翻翻源码,应该很轻易能找到的
|