使用 Spring Boot 在运行时加载 Yml
Load Yml at runtime with Spring Boot
我在不同的文件夹中有多个 yml 文件。文件夹中的所有文件共享我用 java bean 映射的相同 属性 结构。
在运行时,对于一个工厂,我希望使用在运行时选择的特定文件的值填充正确的 bean。我该怎么做?
谢谢
@ConfigurationProperties 注释或其背后的机制被构建用于 配置 启动 的应用程序,而不是加载数据在运行时。
我确定您可以在运行时以某种方式启动迷你 spring 环境,只是为了使用不同的 spring 配置文件读取此数据(例如,spring-cloud-configserver 如何加载properties) 但这似乎不对,还有更好的选择。
例如,如果您需要在运行时加载该数据,您可以为此使用 jackson 的 yamlfactory,这样您就可以在 3-4 条语句中读取数据。一个很好的例子在这里:https://www.baeldung.com/jackson-yaml.
考虑这样一个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 的键可以是属性文件的“名称”,值可以是 Properties 对象。
switchProperties(String name) 方法将“select”您希望使用的属性文件。使用名称,您将从 Map 中获取适当的 Properties 对象并将其分配给“currentProperties”对象。
这样,每次按键得到一个属性,都会根据你“切换”的内容从“currentProperties”中获取。
重要 - 您必须在加载所有属性后决定默认属性是什么。
我在不同的文件夹中有多个 yml 文件。文件夹中的所有文件共享我用 java bean 映射的相同 属性 结构。
在运行时,对于一个工厂,我希望使用在运行时选择的特定文件的值填充正确的 bean。我该怎么做?
谢谢
@ConfigurationProperties 注释或其背后的机制被构建用于 配置 启动 的应用程序,而不是加载数据在运行时。
我确定您可以在运行时以某种方式启动迷你 spring 环境,只是为了使用不同的 spring 配置文件读取此数据(例如,spring-cloud-configserver 如何加载properties) 但这似乎不对,还有更好的选择。
例如,如果您需要在运行时加载该数据,您可以为此使用 jackson 的 yamlfactory,这样您就可以在 3-4 条语句中读取数据。一个很好的例子在这里:https://www.baeldung.com/jackson-yaml.
考虑这样一个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 的键可以是属性文件的“名称”,值可以是 Properties 对象。 switchProperties(String name) 方法将“select”您希望使用的属性文件。使用名称,您将从 Map 中获取适当的 Properties 对象并将其分配给“currentProperties”对象。
这样,每次按键得到一个属性,都会根据你“切换”的内容从“currentProperties”中获取。
重要 - 您必须在加载所有属性后决定默认属性是什么。