java web 可配置 编程_使用 yaml+groovy 实现 Java 代码可配置化

本文介绍了一种使用YAML格式进行配置文件加载与解析的方法。通过YamlConfigLoader类可以实现单个配置文件的内容解析,并通过YamlConfigDirLoader类来加载指定目录下的所有配置文件。最终,FieldsConfigLoader类在应用启动时加载所有配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

配置解析

接下来,需要编写配置解析器,将配置文件内容加载到内存,建立字段映射。 配置化的核心,实际就是建立映射关系。

YamlConfigLoader 实现了单个配置内容的解析。

package zzz.study.groovy;

import com.alibaba.fastjson.JSON;

import com.esotericsoftware.yamlbeans.YamlReader;

import java.util.List;

import java.util.stream.Collectors;

/**

* Created by yuankui on 17/6/13.

*/

public class YamlConfigLoader {

public static ReportFieldConfig loadConfig(String content) {

try {

YamlReader reader = new YamlReader(content);

Object object = reader.read();

return JSON.parseObject(JSON.toJSONString(object), ReportFieldConfig.class);

} catch (Exception e) {

throw new RuntimeException("load config failed:" + content, e);

}

}

public static List loadConfigs(List contents) {

return contents.stream().map(YamlConfigLoader::loadConfig).collect(Collectors.toList());

}

}

YamlConfigDirLoader 从指定目录下加载所有配置文件,并使用 YamlConfigLoader 建立所有字段的映射关系。实际工程应用中,通常是将配置保存在DB中,并从DB里读取配置。

package zzz.study.groovy;

import org.springframework.util.StreamUtils;

import java.io.File;

import java.io.FileInputStream;

import java.nio.charset.Charset;

import java.util.Arrays;

import java.util.List;

import java.util.stream.Collectors;

/**

* Created by shuqin on 17/11/23.

*/

public class YamlConfigDirLoader {

private String dir;

public YamlConfigDirLoader(String dir) {

this.dir = dir;

}

public List loadConfigs() {

File[] files = new File(dir).listFiles();

return Arrays.stream(files).map(

file -> {

try {

String

content =

StreamUtils.copyToString(new FileInputStream(file), Charset.forName("utf-8"));

return YamlConfigLoader.loadConfig(content);

} catch (java.io.IOException e) {

System.err.println(e.getMessage());

throw new RuntimeException(e);

}

}

).collect(Collectors.toList());

}

}

FieldsConfigLoader 在应用启动的时候,调用 YamlConfigDirLoader 的能力加载所有配置文件。

package zzz.study.groovy;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* Created by shuqin on 17/11/22.

*/

public class FieldsConfigLoader {

private static Logger logger = LoggerFactory.getLogger(FieldsConfigLoader.class);

private static Map fieldConfigMap = new HashMap<>();

static {

try {

List fieldConfigs = new YamlConfigDirLoader("src/main/resources/scripts/").loadConfigs();

fieldConfigs.forEach(

fc -> fieldConfigMap.put(fc.getName(), fc)

);

logger.info("fieldConfigs: {}", fieldConfigs);

} catch (Exception ex) {

logger.error("failed to load fields conf", ex);

}

}

public static ReportFieldConfig getFieldConfig(String name) {

return fieldConfigMap.get(name);

}

}

041f085300717a7523d392c1d525c5c3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值