Java 如何处理多个应用程序中使用的大型静态配置类?
分配给我的一组相关应用程序共享一个配置值的数据库表,该表包含“应用程序”、“配置名称”、“配置类型”(即字符串、整数)和“配置值”列。还有一个存储过程,它接收字符串(applicationName),并返回applicationName==application的所有配置名称、类型和值 在每个应用程序中,都会实例化一个包装类,其中包含一个静态ThreadLocal(以下称为“静态配置”),该静态配置会从应用程序的配置表中提取所有值 加载配置值时,存储过程返回大量迭代的属性列表,遍历大量if-else语句列表,测试“config_name”列是否与字符串文本匹配,如果匹配,则将值加载到不同名称的变量中 例: 每个应用程序的配置范围在60-100ish之间,每个应用程序都有一个相同的配置类,只保留它们试图读取的属性的名称 因此,我的问题是:Java 如何处理多个应用程序中使用的大型静态配置类?,java,oop,configuration,object-oriented-analysis,Java,Oop,Configuration,Object Oriented Analysis,分配给我的一组相关应用程序共享一个配置值的数据库表,该表包含“应用程序”、“配置名称”、“配置类型”(即字符串、整数)和“配置值”列。还有一个存储过程,它接收字符串(applicationName),并返回applicationName==application的所有配置名称、类型和值 在每个应用程序中,都会实例化一个包装类,其中包含一个静态ThreadLocal(以下称为“静态配置”),该静态配置会从应用程序的配置表中提取所有值 加载配置值时,存储过程返回大量迭代的属性列表,遍历大量if-el
感谢您的帮助!很抱歉有这么多问题!?使用
while
循环将数据库查询结果复制到两个映射中,可以消除级联的if-then-else
,一个是基于字符串的配置变量的映射[String,String]
,另一个是映射[String,Integer]
用于整数配置变量。然后该类可以提供以下操作:
public String lookupStringVariable(String name, String defaultValue) {
String value = stringMap.get(name);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
public int lookupIntVariable(String name, int defaultValue) {
Integer value = intMap.get(name);
if (value == null) {
return defaultValue;
} else {
return value.intValue();
}
}
如果需要(可能是为了运行时性能)将配置值存储在配置类的字段中,那么配置类可以将上述两个操作设置为private
,并使用它们初始化字段。例如:
logLevel = lookupIntVariable("log_level", 2);
logDir = lookupStringVariable("log_dir", "/tmp");
替代方案(但互补)建议编写一个代码生成器应用程序,该应用程序将查询DB表,并为DB表的
application
列中的每个值生成一个单独的Java类。生成的Java类的实现将使用您想要的任何编码方法来查询DB表并检索特定于应用程序的配置n个变量。编写此生成器应用程序后,只要更新DB表以添加/修改配置变量,就可以重新运行它。如果决定编写这样的生成器,可以使用print()
语句来生成Java代码。或者,您可以使用模板引擎来减少与print()相关的一些详细信息
语句。模板引擎的一个示例是,但列表中还有几十个。您最好将数据库访问与应用程序初始化分开。基本定义是通过查询一个应用程序的设置返回的Map
:
Map<String,String> config = dbOps.getConfig("myappname");
// which populates a map from the config_name/config_value queries:
// AS: config.put(result.getString("config_name"), result.getString("config_value");
void init(Map<String,String> config) {
myConfigurationValue1 = config.get("myConfig1");
myConfigurationValue2 = config.get("myConfig2");
}
void init(Map<String,String> config) {
myConfigurationValue1 = config.get("myConfig1");
myConfigurationValue2 = config.get("myConfig2");
}
void init(Config config) {
myConfigurationValue1 = config.get("myConfig1", "aDefaultVal");
myConfigurationInt2 = config.getInt("myConfig2", 100);
}