上一篇文章中,我们讲了如何在Spring环境下自定义加载配置文件。
毕竟现在Spring开发是一种通用方式,项目中不使用Spring的还真是不多见。
但是有一种情况,就是如果我们开发的是一个通用中间件产品,最少依赖原则,希望用户依赖最少,那么基于该需求,笔者就简单介绍下如何在非Spring环境下自定义加载配置文件。
当然,maven还是需要的,笔者就只依赖一个Apache-Commons工具类和一个测试Junit
读者可自行添加依赖
既然不使用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类型的。
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