非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

 

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