ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

配置文件管理

2020-07-11 13:41:06  阅读:205  来源: 互联网

标签:配置文件 管理 simple app ConfigFactory application conf config


Typesafe的Config库,纯Java写成、零外部依赖、代码精简、功能灵活、API友好。

支持Java properties、JSON、JSON超集格式HOCON以及环境变量。

它也是Akka的配置管理库。

概述

  • 纯java实现,无任何依赖
  • 充分的测试
  • 支持: Java properties, JSON, and a human-friendly JSON superset
  • 可以合并各种格式的配置文件
  • 可以通过文件、urls、classpath加载配置
  • 支持多层嵌套的配置方式
  • 识别Java system properties, 如java -Dmyapp.foo.bar=10
  • 可以转换长短,大小等单位。如配置文件中timeout=10s,则可以转换成任意的毫秒或者
  • 类型转换,比如yes可以转换为boolean类型的true
  • JSON superset features:
    • comments
    • includes
    • substitutions ("foo" : ${bar}, "foo" : Hello ${who})
    • properties-like notation (a.b=c)
    • less noisy, more lenient syntax
    • substitute environment variables (logdir=${HOME}/logs)

目前config只支持配置文件,如果想从数据库获取配置文件,需要自己DIV。config库很擅长合并配置。

例子

引入maven
<!-- 配置管理 -->
<dependency>
    <groupId>com.typesafe</groupId>
    <artifactId>config</artifactId>
    <version>1.4.0</version>
</dependency>
application.conf
# these are our own config values defined by the app
simple-app {
    answer=42
}

# Here we override some values used by a library
simple-lib.foo="This value comes from simple-app's application.conf"
simple-lib.whatever = "This value comes from simple-app's application.conf"

 

默认加载classpath下的application.conf,application.jsonapplication.properties文件。通过ConfigFactory.load()加载。

CommonConfig类
package org.dreams.transaction.config;

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;

public class CommonConfig {

    private Config config;

    //指定配置文件
    public CommonConfig(Config config) {
        this.config = config;
        config.checkValid(ConfigFactory.defaultReference(), "simple-lib");
    }

    // 默认加载classpath下的application.*
    public CommonConfig() {
        this(ConfigFactory.load());
    }

    //打印
    public void printSetting(String path) {
        System.out.println("The setting '" + path + "' is: " + config.getString(path));
    }

    public static void main(String[] args) {
        CommonConfig s = new CommonConfig();
        s.printSetting("simple-app.answer");
    }
}

 

ConfigFactory.load()会加载配置文件,默认加载classpath下的application.conf,application.jsonapplication.properties文件。
也可以调用ConfigFactory.load(confFileName)加载指定的配置文件。

配置内容即可以是层级关系,也可以用”.”号分隔写成一行:

host{  
  ip = 127.0.0.1  
  port = 2282  
}

或者

host.ip = 127.0.0.1
host.port = 2282

 

即json格式和properties格式。(貌似.json只能是json格式,.properties只能是properties格式,而*.conf可以是两者混合,而且配置文件只能是以上三种后缀名)

冲突

如果多个config 文件有冲突时,解决方案有:

  1. a.withFallback(b) //a和b合并,如果有相同的key,以a为准
  2. a.withOnlyPath(String path) //只取a里的path下的配置
  3. a.withoutPath(String path) //只取a里除path外的配置

例如:

Config firstConfig = ConfigFactory.load("test1.conf");  
Config secondConfig = ConfigFactory.load("test2.conf");  

//a.withFallback(b)  a和b合并,如果有相同的key,以a为准  
Config finalConfig = firstConfig.withOnlyPath("host").withFallback(secondConfig);

 

finalConfig中的配置是test1.conf中的host节点的所有配置与test2.conf所有节点的配置合集。

来个例子
package org.dreams.transaction.config;

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;

public class CommonConfig {

    private Config config;

    //指定配置文件
    public CommonConfig(Config config) {
        this.config = config;
    }

    // 默认加载classpath下的application.*
    public CommonConfig() {
        this(ConfigFactory.load());
    }

    //打印
    public void printSetting(String path) {
        System.out.println("The setting '" + path + "' is: " + config.getString(path));
    }

    public static void main(String[] args) {
        Config javaSystemProperties = ConfigFactory.load("no-such-resource-only-system-props");
        CommonConfig s = new CommonConfig(javaSystemProperties);
        Config appConfig = ConfigFactory.parseResources("application.conf");
        Config testConfig = ConfigFactory.parseResources("test.conf");

        s.config = javaSystemProperties
                .withFallback(testConfig)
                .withFallback(appConfig)
                .resolve();     // substitute variables in config if any
        s.printSetting("simple-app.answer");
    }
}

 

增加test.conf

simple-app {
  answer=422
}

simple-lib.foo="This value comes from simple-app's test.conf"
simple-lib.whatever = "This value comes from simple-app's test.conf"

 

application.conf

simple-app {
  answer=42
}

simple-lib.foo="This value comes from simple-app's application.conf"
simple-lib.whatever = "This value comes from simple-app's application.conf"

 

输出结果

The setting 'simple-app.answer' is: 422

标签:配置文件,管理,simple,app,ConfigFactory,application,conf,config
来源: https://www.cnblogs.com/30go/p/13283279.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有