【发布时间】:2021-03-25 03:29:14
【问题描述】:
我在不同的文件夹中有多个 yml 文件。文件夹中的所有文件共享我使用 java bean 映射的相同属性结构。
在运行时,通过工厂,我想用运行时选择的特定文件的值填充正确的 bean。我该怎么做?
谢谢
【问题讨论】:
标签: spring-boot yaml configurationproperties
我在不同的文件夹中有多个 yml 文件。文件夹中的所有文件共享我使用 java bean 映射的相同属性结构。
在运行时,通过工厂,我想用运行时选择的特定文件的值填充正确的 bean。我该怎么做?
谢谢
【问题讨论】:
标签: spring-boot yaml configurationproperties
考虑一个像这样的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”中获取。
重要 - 您必须在加载所有属性后决定默认属性是什么。
【讨论】:
@ConfigurationProperties 注释或其背后的机制被构建用于在启动时对应用程序进行配置,而不是在运行时加载数据。
我确信您可以在运行时以某种方式启动迷你 spring 环境,只是为了使用不同的 spring 配置文件读取这些数据(例如 spring-cloud-configserver 加载属性的方式),但这似乎不正确,还有更好的选择。
例如,如果您需要在运行时加载该数据,您可以使用 jackson 的 yamlfactory,这样您就可以在 3-4 个语句中读取数据。一个很好的例子在这里:https://www.baeldung.com/jackson-yaml。
【讨论】: