多个 PropertySourceLoader 是如何确定顺序的?

2023-01-06 07:22:05 +08:00
 JinTianYi456
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 先加载?

1263 次点击
所在节点    Java
6 条回复
7911364440
2023-01-06 09:44:48 +08:00
打印下日志不就知道了吗
JinTianYi456
2023-01-06 10:23:53 +08:00
@7911364440 #1 我不是要知道它具体调用的是哪个,而是想知道存在那么多个 PropertySourceLoader ,是如何排序的还是无序的?
RedBeanIce
2023-01-06 13:21:46 +08:00
这个对象好像蛮复杂的,之前 debug 时,也对这个对象不是很熟悉。
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 的总述,应该就是你需要的内容。
9fan
2023-01-06 15:08:53 +08:00
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;
}
9fan
2023-01-06 15:10:11 +08:00
不知道怎么发图片,自己看了,也觉得难受,自己翻翻源码,应该很轻易能找到的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/906895

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX