V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JinTianYi456
V2EX  ›  Java

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

  •  
  •   JinTianYi456 · 2023-01-06 07:22:05 +08:00 · 1221 次点击
    这是一个创建于 447 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 先加载?

    6 条回复    2023-01-06 15:10:11 +08:00
    7911364440
        1
    7911364440  
       2023-01-06 09:44:48 +08:00
    打印下日志不就知道了吗
    JinTianYi456
        2
    JinTianYi456  
    OP
       2023-01-06 10:23:53 +08:00
    @7911364440 #1 我不是要知道它具体调用的是哪个,而是想知道存在那么多个 PropertySourceLoader ,是如何排序的还是无序的?
    RedBeanIce
        3
    RedBeanIce  
       2023-01-06 13:21:46 +08:00
    这个对象好像蛮复杂的,之前 debug 时,也对这个对象不是很熟悉。
    damai0419
        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 的总述,应该就是你需要的内容。
    9fan
        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;
    }
    9fan
        6
    9fan  
       2023-01-06 15:10:11 +08:00
    不知道怎么发图片,自己看了,也觉得难受,自己翻翻源码,应该很轻易能找到的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3246 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:55 · PVG 21:55 · LAX 06:55 · JFK 09:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.