非Spring环境下的自定义加载配置文件(分层次加载)

前言:

    上一篇文章中,我们讲了如何在Spring环境下自定义加载配置文件。

    毕竟现在Spring开发是一种通用方式,项目中不使用Spring的还真是不多见。

 

    但是有一种情况,就是如果我们开发的是一个通用中间件产品,最少依赖原则,希望用户依赖最少,那么基于该需求,笔者就简单介绍下如何在非Spring环境下自定义加载配置文件。

 

环境准备:

    当然,maven还是需要的,笔者就只依赖一个Apache-Commons工具类和一个测试Junit

    读者可自行添加依赖

 

自定义配置加载器:

    1.加载器实现

        既然不使用Spring,那么就直接使用static来实现,代码如下(与上一篇文章中的内容大同小异):

/**
 * 不使用spring的加载配置的方式
 *
 * @author lucky
 * @create 2020/3/7
 * @since 1.0.0
 */
public class ConfigLoader {

    private static Properties prop = new Properties();
    public static final String DEFAULT_CONFIG_FILE_NAME = "env.properties";
    /**
     * 会根据window和Linux的不同来适配
     */
    public static final String SLASH = File.separator;

    static {
        loadProperties();
    }

    /**
     * 加载配置文件分为三个层次
     * 1.加载项目内置classpath:env.properties
     * 2.加载外部配置文件env.properties(会给定一个默认路径)
     * 3.加载JVM命令行参数
     */
    private static void loadProperties() {
        loadLocalProperties();
        loadExtProperties();
        loadSystemEnvProperties();
    }

    /**
     * 加载JVM命令行参数、Environment参数
     */
    private static void loadSystemEnvProperties() {
        prop.putAll(System.getenv());
        prop.putAll(System.getProperties());
    }

    /**
     * 加载外部配置文件env.properties(会给定一个默认路径)
     * 笔者所在公司,会根据不同的项目名,统一路径设置为
     * /envconfig/{app.name}/env.properties
     */
    private static void loadExtProperties() {
        // 获取全路径
        // 所以需要首先在内部env.properties中配置上app.name
        if (prop.containsKey("app.name")) {
            String appName = prop.getProperty("app.name");
            String path = SLASH + "envconfig" + SLASH + appName + SLASH + DEFAULT_CONFIG_FILE_NAME;

            Properties properties = ConfigUtil.loadProperties(path);
            if (null != properties) {
                prop.putAll(properties);
            }
        }
    }


    /**
     * 对外提供的方法,获取配置信息
     * @param key key
     * @return 配置值
     */
    public static String getValue(String key) {
        return prop.getProperty(key);
    }


    /**
     * 加载项目内置classpath:env.properties
     */
    private static void loadLocalProperties() {
        Properties properties = ConfigUtil.loadProperties(ConfigUtil.CLASSPATH_FILE_FLAG + DEFAULT_CONFIG_FILE_NAME);
        if (null != properties) {
            prop.putAll(properties);
        }
    }
}

    注意:ConfigUtil.java工具类还是原来的,没有变化,笔者在这里不再重写。

    使用static,在项目启动后默认加载loadProperties()方法。主要的改变就是这些私有方法都变成了static类型的。

 

    2.测试

public class LocalConfigLoaderTest {

    @Test
    public void testConfig() {
        String s = ConfigLoader.getValue("zookeeper.serverList");
        System.out.println(s);
    }
}

    代码和测试都比较简单,笔者就不再详述。

 

总结:

    以上就是在不使用Spring环境下加载配置文件的方式。

    笔者也是在参考了Sentinel项目的SentinelConfigLoader.java类后写的。

    读者也可以自行看下大牛们的实现,并在实际项目中学以致用。

 

参考:

   Sentinel_1.7开源项目 https://github.com/alibaba/Sentinel

 

你可能感兴趣的:(CoreJava)