如何使用属性文件在应用程序中存储全局变量,但也可以使用公共静态最终变量将它们注入应用程序?
看了这个问题,我希望找到一种方法,我可以从属性文件注入我的静态final变量到应用程序。我很失望,但最终找到了一个我可以鱼与熊掌兼得的方法。
我把这个解决方案贴在下面,以添加到SO的纲要…
我的解决方案涉及全局变量的概念(这显然是不好的),所以,如果你不装腔作势,请继续往下读。
我相信,尽管我们都想追随函数式编程的狂热从我们的函数中删除所有"拉出的"依赖关系的概念,有一些事实需要绝对的基础,因此需要一些全局变量形式的真实来源在运行时应用程序中是很有用的。但我不想挑起一场口水仗…
解决方案从一个名为Globals的公共类开始(或者像这样明显的东西)
要从属性文件中注入属性,您需要建立属性的基名(或位置)属性文件,例如
"com.example.myapp.core.configuration"
可能代表一个配置您的核心模块中的文件,物理url为jar:file:C:/jars/myapp.ear/core.jar!/com/example/myapp/core/configuration.properties
。将此基名设置为静态final变量:public static final String CORE_CONFIGURATION_BASENAME = "com.example.myapp.core.configuration";
然后将属性键定义为私有变量(用于封装),例如
private static final String DOMAIN_PACKAGE_KEY = "myapp.domain.package.name";
然后将属性本身定义为一个公共的final静态变量,如下所示:
public static final String DOMAIN_PACKAGE; //we leave it uninitialized on purpose.
上面的代码在构建时会抛出编译错误,所以我们需要使用静态块初始化它。为此,我们必须首先使用我们定义的基本名称检索资源束:
static { ResourceBundle bundle = PropertyResourceBundle(CORE_CONFIGURATION_BASENAME); ... }
然后我们使用我们定义的键来分配最终属性:"
static { ResourceBundle bundle = PropertyResourceBundle(CORE_CONFIGURATION_BASENAME); DOMAIN_PACKAGE = bundle.getString(DOMAIN_PACKAGE_KEY); }
就是这样了。这将在加载Globals类时初始化,所以如果你改变了配置属性使用这些值并希望它们反映在应用程序中,则需要重新启动应用程序以强制重新加载类加载器类。
现在完全:
package com.example.myapp.core.util;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
public class Globals {
public static final String CORE_CONFIGURATION_BASENAME = "com.example.myapp.core.configuration";
private static final String DOMAIN_PACKAGE_KEY = "myapp.domain.package.name";
public static final String DOMAIN_PACKAGE; //we leave it uninitialized on purpose.
static {
ResourceBundle bundle = PropertyResourceBundle(CORE_CONFIGURATION_BASENAME);
DOMAIN_PACKAGE = bundle.getString(DOMAIN_PACKAGE_KEY);
}
}