如果您使用的是spring-boot作为项目主框架,那么你肯定知道yml是什么,一种方便阅读的配置文件
但是在运行main方法时,不想使用spring上下文, 只是纯解析yml文件,那么就引入了下文(本人业务需求是:在使用spark生成jar文件提交到集群时,想通过已经配置好的yml文件去读取相关参数,方便上下线时维护yml文件就足够了)
在没有yml时,代码中需要这样配置
String esIpAddr = "192.168.53.92";
String esPort = "9200";
String esNodePort = "9300";
String clusterName = "my-es-5";
String index = "sparkresult";
String type = "sparkresult";
String mongodbUser = "xxx";
String mongodbPass = "xxx";
String mongodbIpAddr = "192.168.31.203";
String mongodbPort = "27018";
String mongodbDatabase = "sns";
String mongodbCollectionIn = "igomoMemberInfo_Spark_input";
String mongodbCollectionOut = "igomoMemberInfo_Spark_output";
因此,当配置文件移入yml时, application.yml是主配置文件,其中会有
spring:
profiles:
active: dev
的配置来制定application-dev.yml作为测试环境的yml文件。
为了方便演示 对应的配置文件如下
# application.yml 的配置如下
spring:
dubbo:
application:
id: recommend-provider
#application-dev.yml 的配置如下
server:
port: 8097
dubbo:
registry:
protocol: zookeeper
#application-prod.yml 的配置如下
略
以下是具体的代码和演示,记得导入pom依赖包
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.9.5</version>
</dependency>
loadConfig方法
public static void loadConfig() throws FileNotFoundException {
//配置文件路径
InputStream reader = XunMeiSpark.class.getResourceAsStream("/application.yml");
//yml读取配置文件,指定返回类型为Map,Map中value类型为LinkedHashMap
map = new Yaml().loadAs(reader, LinkedHashMap.class);
if ("dev".equals(String.valueOf(map.get("spring").get("profiles").get("active")))) {
InputStream readerDev = XunMeiSpark.class.getResourceAsStream("/application-dev.yml");
mapOthers = new Yaml().loadAs(readerDev, LinkedHashMap.class);
} else {
InputStream readerProd = XunMeiSpark.class.getResourceAsStream("/application-prod.yml");
mapOthers = new Yaml().loadAs(readerProd, LinkedHashMap.class);
}
}
getConfig方法和getValue方法
public static String getConfig(String configKey) {
String result = getValue(map, configKey);
if (EmptyUtils.isEmpty(result)) {
result = getValue(mapOthers, configKey);
}
return result;
}
public static String getValue(LinkedHashMap<String, ?> map, String configKey) {
String result = "";
String[] configKeys = configKey.split("\\.");
LinkedHashMap<String, ?> linkedHashMap = map;
for (String key : configKeys) {
Object o = linkedHashMap.get(key);
if (EmptyUtils.isNotEmpty(o) ) {
if(o instanceof LinkedHashMap){
linkedHashMap = (LinkedHashMap<String, ?>) o;
}else{
result = o.toString();
}
} else {
continue;
}
}
return result;
}
main方法代码:
//yml读取配置文件,指定返回类型为Map,Map中value类型为LinkedHashMap
static LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>>> map;
static LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>>> mapOthers;
public static void main(String[] args) throws UnknownHostException, FileNotFoundException {
//加载运行配置文件
loadConfig();
logger.info(getConfig("spring.dubbo.application.id"));
logger.info(getConfig("server.port"));
logger.info(getConfig("spring.dubbo.registry.protocol"));
}
运行main方法得到配置文件的内容