Java中处理复杂配置的最佳方法
Posted
技术标签:
【中文标题】Java中处理复杂配置的最佳方法【英文标题】:Optimum method for handling complex configuration in Java 【发布时间】:2012-10-17 21:56:15 【问题描述】:所以我在 Java 中为 Accumulo 构建各种索引和摄取类
但我的问题没有直接关系。
我有一个属性文件,其中存储了很长的关键字和数据库表名列表(假设有两打并且还在增长)。
现在,当我的主类被实例化时,我将所有这些属性读入它们相关的 String 对象并在整个过程中使用它们。但是,其中一些项目需要传递给其他类,有时是大块传递。
我认为我的选择是
-
像现在这样继续,这似乎很糟糕,因为如果我以错误的顺序提交令牌,可能会发生各种讨厌的事情。
传递属性对象本身,让每个类处理实例化自己的字符串对象(如果在文件中添加或删除标记,将来维护起来很容易)。
转移到将信息存储在 JSON 文件中,该文件作为特殊的类对象被读入,该对象被传递给需要从中提取一些信息的任何人(小缺点是每个类都从表名创建表引用根据需要,在使用 JSON 的情况下,继续实例化所有表引用可能是有意义的,这样类就可以请求引用,但随后会在不需要时经常创建一些额外的引用。)
其他一些选项 Java 专家知道我不知道
我对此感到担忧,因为过去我主要是嵌入式和小型系统的 C++ 开发人员。这是我的第一个大型项目之一,所以我试图从一开始就做事。我已经准备好一堆包括设计模式在内的书籍,只是为了让我沾沾自喜,但任何一般的编程实践知识库我都会很乐意接受建议。
我试图将其概括化,以便其他人受益,但可能需要更多细节,请告诉我。
【问题讨论】:
【参考方案1】:选项 (2) 似乎是一个不错的方法。
一种变体是将所有字符串从主 Properties 对象提取到单独的 Properties(或 HashMap)对象中,可能基于元素名称的前缀。因此Foo
类获取所有名称以foo.
为前缀的属性,Bar
类获取所有bar.xxx
属性,依此类推。
这将属性保存在逻辑上(和物理上)单独的集合中,并为给定的类提供它需要的那些属性。如果所有类都需要共享公共属性(可能带有 all.
或 global.
前缀,或者根本没有前缀),则可以将这些属性添加到每个单独的 Properties 对象中。
【讨论】:
许多表和关键字在多个类之间共享,但不是全部。就像我正在处理的数据一样,属性文件中项目的使用非常稀疏,我主要关注未来的可维护性,无论是随着属性文件的增长,还是随着值的变化或消失。现在我正在考虑更多真正的解决方案可能是进一步分解类,以便每个类只需要少量的整体属性,然后所有维护都在主类中,这不会令人头疼。 【参考方案2】:您的复杂程度要求您直接处理 java.util.Properties 文件。
这是一个简单的对象,它应该可以根据需要进行缩放。我不建议将您的属性映射到 Java 对象,因为您最终会不断更改映射文件;您需要只有 java.util.Map 才能提供的全部灵活性。
顺便说一句,您需要这个的事实听起来不正确。可能存在需要在您的应用程序中重新考虑的全局设计问题。
此外,json 解决方案可能很好,因为在分层树中构建属性可能有助于降低配置文件的复杂性,但我再次避免将 json 对象映射到 Java 对象,因为您的模型是主题经常改变(据我所知)。
您可能会尝试在配置属性之间找到“模式”并尝试提取一些组织。一旦您猜到了配置中内置的一些好的“业务对象”,您就可以将配置简化为这些对象的数组。
JSON 听起来很适合我。您的问题可以看作是“复杂配置”的原型,这种情况并不少见(想想maven中的pom.xml)。所以我认为你需要两件事:
-
在您的配置中提取一些组织
使用一些结构化的配置格式(如 JSON 或 XML)
【讨论】:
我继续使用属性文件方法,它大大减少了每次需要添加和更改某些内容时的维护工作量,但仍然感觉不太顺畅。没有太多结构,它实际上只是一长串键值对,保留数据库表名或跨多个类使用的关键字。依赖属性文件的另一个原因是,十几个类需要相同和不同部分的信息。 我正在考虑为 OWNER API (owner.aeonbits.org) 添加一些“嵌套”可能性,这样您就可以拥有“嵌套属性”或将单个属性文件建模为嵌套对象结构。目前缺少此功能,但我正在考虑如何以最佳形式实现此功能。 正如我提到的,这里没有嵌套,只是一个随着时间缓慢增长和变化的纯列表。【参考方案3】:Commons Configuration 有几个功能可以帮助您组织
独立于源的配置数据(属性文件、XML 文件、数据库...) 分层属性 声明和创建 bean【讨论】:
以上是关于Java中处理复杂配置的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
在Laravel / Vue.js项目中共享静态/配置数据的最佳方法是什么