java 通过yml配置文件循环创建对象并存放到map中
时间: 2024-12-24 15:23:35 浏览: 12
在 Java 中,如果你想要使用 YAML 配置文件循环创建对象并存储到 `Map` 中,你可以使用第三方库如 SnakeYAML 或 Jackson-YAML 来解析 YAML,然后利用反射 API 来动态创建对象。以下是基本步骤:
1. 添加依赖:
如果使用 Spring Boot,它已经包含了 SnakeYAML 的支持。如果没有,你需要添加 Maven 或 Gradle 依赖。例如:
```xml
<!-- Maven -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!-- Gradle -->
implementation 'org.yaml:snakeyaml'
```
2. 解析 YAML 文件:
使用 `Yaml` 类读取 YAML 配置内容,比如 `ConfigurableYamlFactory` 对象(Spring Boot 自带):
```java
import org.yaml.snakeyaml.Yaml;
private Yaml yaml = new Yaml();
public Map<String, YourObject> loadObjectsFromYaml(String configFile) {
try (InputStream inputStream = getClass().getResourceAsStream(configFile)) {
return yaml.loadAs(inputStream, Map.class);
} catch (Exception e) {
throw new RuntimeException("Failed to parse YAML", e);
}
}
```
这里假设你的对象是一个名为 `YourObject` 的类。
3. 循环创建对象并填充 Map:
获取到 `Map` 后,遍历 `Map` 的键值对,通过 `Class.forName()` 和反射机制实例化对象,并将它们添加到 `Map` 中:
```java
private void createAndAddToMap(Map<String, Map<String, Object>> configData, Map<String, YourObject> map) {
for (String key : configData.keySet()) {
Map<String, Object> entry = configData.get(key);
String className = (String) entry.get("class"); // 假设 class 字段存在
try {
Class<?> clazz = Class.forName(className);
YourObject obj = (YourObject) clazz.newInstance();
// 设置对象属性(如果需要)
obj.setProperties(entry); // 假设 setProperties 是一个方法用于设置字段值
map.put(key, obj);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
log.error("Error creating object from config", e);
}
}
}
```
4. 调用函数处理配置:
```java
public void init() {
Map<String, YourObject> yourObjects = loadObjectsFromYaml("config.yml");
createAndAddToMap(yourObjects, yourObjects); // 相同的 map 可能是为了复用
}
```
注意,这只是一个示例,实际应用中可能需要更复杂的错误处理和条件判断。另外,`setProperties` 方法和 YAML 中的对象结构需要对应起来才能正确设置对象的属性。
阅读全文