純Java代碼解析yml文件(多個yml)

如果您使用的是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方法得到配置文件的內容

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章