我将回答一个更一般的问题 - 如何很好地实现数据库存储应用程序配置?
一般来说,您可能会针对应用程序的不同范围进行配置,而不是单一的多合一配置。 IE。例如,您可能有 CarConfig、CacheConfig、BookingConfig 等,包括一些通用的 AppConfig。有时您需要在开发过程中添加/删除属性。
所以为了方便处理,我建议您使用一个 single 字符串键/值配置表来服务所有配置.方法如下:
为每个配置创建一个这样的界面:
public interface CarConfig {
@PropertyName("default.color")
@DefaultValue("red")
String getDefaultColor();
void setDefaultColor(String color);
@PropertyName("max.size")
@DefaultValue(100)
int getMaxSize();
void setMaxSize(int size);
...
}
在应用程序启动时,单个配置实现被实例化,然后在应用程序之间共享。实现是通过创建代理来完成的。
对于getters,代理分析调用的方法(例如:getDefaultColor())——它从注解@PropertyName 中获取属性名称。然后,它使用该属性名称查询数据库中的配置表。该值被转换(因为它作为字符串存储在表中)为方法返回类型(在 getMaxSize() 为 int 的情况下)并返回。
对于 setters,代理将给定值保存到配置表中。无需复制 @PropertyName - 它可以从相应的 getter 派生。
所以当你需要一个配置属性值时,你可以这样:
CarConfig carConfig = configs.get(CarConfig.class);
String defaultColor = carConfig.getDefaultColor();
为什么配置实现应该是单例并在应用程序之间共享?因为在这种情况下您可以启用缓存 - 如果您确保配置属性始终仅通过您的配置使用,您可以在启动时读取所有值并将它们存储在内存中,然后根本不查询数据库,因为没有除了您的配置类之外的任何其他更改来源。 Setter 会更新缓存的值以及数据库配置表。
配置表类似于:
| key |value |
...
|"default.color"|"blue"|
|"max.size" |"85" |
...
因此,在单个配置表的情况下,添加新属性只需将 getter 和 setter 添加到类 - 代理会自动获取它。
在 CUBA 开源框架中使用了类似的架构 - https://www.cuba-platform.com/。
相反,为单独的配置提供一个单独的表具有以下特点:
- 您需要为每个配置创建一个新表;
- 添加/删除新配置属性需要更改表架构。