【问题标题】:Load Yml at runtime with Spring Boot使用 Spring Boot 在运行时加载 Yml
【发布时间】:2021-03-25 03:29:14
【问题描述】:

我在不同的文件夹中有多个 yml 文件。文件夹中的所有文件共享我使用 java bean 映射的相同属性结构。

在运行时,通过工厂,我想用运行时选择的特定文件的值填充正确的 bean。我该怎么做?

谢谢

【问题讨论】:

    标签: spring-boot yaml configurationproperties


    【解决方案1】:

    考虑一个像这样的Bean:(伪代码,只是为了解释)

    class MyConfigBean {
       private Properties currentProperties;
       private Map<String, Properties> allPropertiesMap;
    
       void loadAllProperties() { ... }
    
       void switchProperties(String name) {
           this.currentProperties = this.allPropertiesMap.get(name);
       }
    
       String getProperty(String key) {
         return this.currentProperties.get(key);
       }
    }
    

    您可以将所有 Yaml 文件加载到 bean 中的 Map 中。 Map 的键可以是属性文件的“名称”,值是属性对象。 switchProperties(String name) 方法将“选择”您希望使用的属性文件。使用该名称,您将从 Map 中获取适当的 Properties 对象并将其分配给“currentProperties”对象。

    这样,每次你按键获取一个属性时,它都会根据你“切换”的内容从“currentProperties”中获取。
    重要 - 您必须在加载所有属性后决定默认属性是什么。

    【讨论】:

      【解决方案2】:

      @ConfigurationProperties 注释或其背后的机制被构建用于在启动时对应用程序进行配置,而不是在运行时加载数据。

      我确信您可以在运行时以某种方式启动迷你 spring 环境,只是为了使用不同的 spring 配置文件读取这些数据(例如 spring-cloud-configserver 加载属性的方式),但这似乎不正确,还有更好的选择。

      例如,如果您需要在运行时加载该数据,您可以使用 jackson 的 yamlfactory,这样您就可以在 3-4 个语句中读取数据。一个很好的例子在这里:https://www.baeldung.com/jackson-yaml

      【讨论】:

      • 是的,我最终使用了它!谢谢
      • 那么请将答案标记为已接受:) 谢谢! :)
      猜你喜欢
      • 2018-11-22
      • 2017-06-18
      • 2020-12-18
      • 2019-06-23
      • 1970-01-01
      • 2018-10-12
      • 2018-07-07
      • 2017-09-25
      • 1970-01-01
      相关资源
      最近更新 更多