【问题标题】:Best practice of storing Java UI application configuration/settings存储 Java UI 应用程序配置/设置的最佳实践
【发布时间】:2012-01-14 11:53:30
【问题描述】:

我正在研究在支持层次结构和动态加载的同时存储应用程序配置数据的最佳方式是什么。

数据示例:

  • 每列的位置(我们会显示很多表格)
  • 如何可视化每个列或单元格中的数据(例如,某些列可能有不同的方式来显示相同​​的指标)
  • 数据格式(日期或数字)

层级意味着:

我有一个州有几个区,所以会有默认配置,但是一个州可以覆盖部分(或全部)默认配置,一个区可以覆盖部分州配置。

动态加载意味着:

无需重启服务器甚至用户登录即可动态加载和应用新配置。

配置存储格式(可以是文件或数据库):

  • XML - 这是我过去使用的
  • JSON - 所以我可以从配置文件或数据库中读取 JSON 并将其作为对象保存在应用程序内存中
  • 键值对
  • 其他格式?

您对这个主题有什么想法/知识?

谢谢!

【问题讨论】:

  • Java 有一个Properties 类,用于读入和写出一组键/值对。据我所知,它是处理任意配置值集的标准。它甚至可以让您构建 Properties 对象的链/树,因此您可以在父级中拥有默认值,而子级会覆盖。

标签: java xml json configuration preferences


【解决方案1】:

很久以前我写了一些类似的东西。它不是为了分层。它依赖于每个组件都有一个唯一且合理的名称。这是在 XML 和 JSON 流行之前,所以我只使用了属性。

基本上,您从顶部窗口开始,查看它的所有组件,然后根据它的类型(许多实例)调用一个方法(现在您会给它一个更高级的名称,例如“Marshaller” :-) ) 写出用户可能更改并希望恢复的相关信息。递归应用。你会得到类似的东西:

MainFrame.background=#FFFFFF
MainFrame.bounds=200,100,400,500
...
MainFrame.Divider.x=122
...
MainFrame.DataPanel.DataTable.Columns.1.x=423
MainFrame.DataPanel.DataTable.Columns.1.width=22
MainFrame.DataPanel.DataTable.Columns.1.sortedby=Name

您可能会认为这是分层的,但现在使用 XML 或 JSON 可能更好。但基本概念可能适用。您可以使用 DIP 或其他东西来确定正确的 Marshaller。

也许这会给你一些想法。也许没有标准的方法。我很惊讶没有人回答“哦,是的,使用 Apache this 或 Guava that 或 JGoodies”等。

【讨论】:

  • +1:我看到这种技术在大约 20 年前被用于构建带有 X Window 系统的 GUI 应用程序。每个组件级别都有两个属性(typechildren),它们指定组件的类型和子组件列表(表示为嵌套属性)。这两个属性的组合使得一个简单的递归算法可以为应用程序创建整个 GUI 组件层次结构。因此,在您的示例中,将有 MainFrame.type=...(任何实现应用程序主框架的类)和 MainFrame.children=Divider,DataPanel
【解决方案2】:

我是一个名为Config4J 的配置文件解析器库的维护者。从您在问题中提供的详细信息来看,我认为 Config4J 并非 100% 适合您的需求。但是,其文档的某些部分可能会为您提供有用的启发。

我建议您略读“入门”手册的第 2 章和第 3 章,以充分了解语法和 API。然后阅读“实际使用”手册的第二部分(“配置驱动的对象创建”)和第三部分(“Config4JMS 案例研究”)。 Config4J website 底部提供了所有手册的 HTML 和 PDF 版本的链接。

【讨论】:

    【解决方案3】:

    嗯,总是有Java Preferences API。那么你就不必担心这些事情了。

    附录:

    受欢迎(或不受欢迎)可能源于这样一个事实,即开箱即用,首选项在整个系统或用户中都是全局的。因此,应用程序等需要在首选项树中创建自己的名称空间。人们更习惯于每个实例都有自己的属性文件并从那里开始。

    对于更复杂的结构,Preferences API 是一个树结构,类似于 XML DOM。您在树中定位节点并在这些节点下工作。因此,您可以在该表示之上分层结构化数据。

    API 很旧,就像 java logging API 很旧。但是该设计非常基本且有用,因此没有太多要求对其进行更新。集合框架也很旧,但我们每天都(大部分)愉快地生活。

    【讨论】:

    • 我检查了 Java 首选项,但我在网上找到的所有内容看起来都非常旧 - 是不是没有多少人使用它?另外,我可以做比键值对更复杂的事情吗?
    • 属性也是有点分层的。但是有点尴尬。
    • 但是层次结构更符合惯例,而不是由 API 直接支持的一流概念。
    猜你喜欢
    • 2010-09-19
    • 2020-08-22
    • 2012-06-26
    • 2023-04-06
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多