java - 用于参数注入(inject)/属性管理的良好库

标签 java configuration properties dependency-injection configuration-files

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

我正在寻找的功能是:

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

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

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

Example usage of my solution
Sample of generated property file TEMPLATE (you copy and edit this)

最佳答案

No need to touch constructor, add dedicated field or setters

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

Ability to auto-generate property file TEMPLATE

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

Ability to update config at runtime, in a thread-safe manner

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

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

或者,如果您在 servlet 容器内运行,则可以在 Spring 配置中添加 JNDI lookups

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

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
        }
    }
}

编写默认配置就像new Configuration().save(file)一样简单,或者升级现有配置就像“new Configuration(file).save(file)”一样简单。

与您的方法不同,此方法是静态类型安全的,并且不会使使用冗余类型说明符访问配置设置的代码变得困惑。也就是说,而不是

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

你可以简单地写

if (config.proxyEnabled) {

并且由于该字段可以是 boolean 类型(不是 boolean 值),因此您甚至不会在这里冒 NullPointerException 的风险。

关于java - 用于参数注入(inject)/属性管理的良好库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12828924/

相关文章:

java - 在封闭函数中处理未处理的检查异常

java - 如何从javascript发送具有相同编码的参数?

java - 使用RestClient从Scala中的Elasticsearch删除文档

visual-studio-2008 - VS 解决方案中的 ReSharper 配置

java - 使用 Spring Boot 读取自己的属性文件

wix - 根据条件在 WiX 中设置属性

java - 在 Tomcat 6 中为 Java 的 GC 消息添加时间戳

c# - C# Windows 应用程序中基于许可证的配置

apache - Wamp SSL 配置抛出 404

Swift:access.property 和 access.method()