2

我有一段代码用于管理属性已有一段时间了。我的老板不喜欢这个解决方案,理由是物业管理应该由知名的库来完成,比如 Spring/Guice。这是可以理解的,我正在寻找替代品,但我找不到能够提供我想要的功能的替代品(或者我可能不知道如何正确使用它们)。

我正在寻找的功能是:

  1. 超级容易在编码期间向类添加新属性
    1. 无需触摸构造函数,添加专用字段或设置器
    2. 使用 Java 代码(尽可能)
    3. 易于添加默认值。如果您只想快速配置某些内容并保持代码正常工作,则无需编辑属性文件
  2. 可以使用任何类型(可以在框架内定义从 String 转换)
  3. 在每个属性的配置加载时运行的自定义验证
    1. 例如检查文件是否存在,检查定义的转换是否成功等。
  4. 能够将参数注入最终字段
  5. 能够自动生成属性文件模板
    1. 尤其是定义描述的能力,最好是在 Java 代码中,然后将其写入模板
  6. 能够在运行时以线程安全的方式更新配置

是否有任何图书馆可以为我提供这些功能?

如果我遗漏了一些东西,而这些都可以通过 Spring/Guice 来满足,那么网上有什么好的资源吗?

我的解决方案的示例用法
生成的属性文件 TEMPLATE 示例(您复制并编辑此文件)

4

1 回答 1

3

无需触摸构造函数,添加专用字段或设置器

那不是依赖注入模式。您可能会替换资源定位器模式,但做得好(特别是在保持可测试性的方式上)并非易事:使用 setter,我可以轻松地重新配置被测类。如果该类依赖于配置文件,每当我需要更改单元测试的设置时,我会编写一个单独的配置文件吗?我会模拟配置类吗?可能,但不完全直截了当......

能够自动生成属性文件模板

正如评论中已经指出的那样,这似乎不是很有用,因为它无法迁移旧的配置文件。

能够在运行时以线程安全的方式更新配置

这通常需要正在配置的组件的支持(例如,更改线程池大小的设置涉及启动/停止工作线程......)。一般来说,处理这个问题的唯一简单方法是重新启动应用程序......

如果您放弃这些要求,Spring 的PropertyOverrideConfigurer就非常适合。

或者,如果您在 servlet 容器中运行,您可以使用JNDI 查找来填充您的 Spring 配置。

如果你真的想生成模板,我不知道一个现成的解决方案。我可能会做类似的事情:

class Configuration {

    int threadCount = 10;

    String secretKey;

    @Description("Number of workers. Default value is number of available cores.")
    int workerThreadCount = Runtime.getRuntime().availableProcessors();

    /** Use default settings */
    Configuration() {

    }

    /** read the settings from the file */
    Configuration(Properties props) {
        for (String prop : props) {
            Field f = getClass().getField(prop);
            f.set(this, props.getValue(prop)); 
            // TODO: type conversion, 
            // e.g. with PropertyEditors, 
            // or Spring's ConversionService, 
            // or invoking the constructor that takes a single string argument, 
            // or ...
        }
    }

    void save() {
        for (Field f : getClass().getFields()) {
            // TODO save the setting
        }
    }
}

编写默认配置将是一个简单的 as new Configuration().save(file),或升级现有配置,如 `new Configuration(file).save(file)' 一样简单。

与您的方法不同,这种方法是静态类型安全的,并且不会使访问具有冗余类型说明符的配置设置的代码混乱。也就是说,而不是

if(config.value(Prop.PROXY_ENABLED,Boolean.class)){

你可以简单地写

if (config.proxyEnabled) {

并且因为该字段可以是布尔类型(不是布尔类型),所以您甚至不会在这里冒 NullPointerException 的风险。

于 2012-10-11T00:05:24.850 回答