前言:
上一篇文章中,我們講了如何在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