Guice和一般应用程序配置

时间:2011-01-26 14:48:43

标签: java configuration guice apache-commons-config

对于用Java编写的监控软件,我考虑使用Google Guice作为DI提供商。项目需要从外部资源(文件或数据库)加载其配置。该应用程序旨在以独立模式或servlet容器运行。

目前,配置不包含依赖项注入的绑定或参数,只有一些全局应用程序设置(JDBC连接定义和关联的数据库管理/监视对象)。

我看到两个选项:

  • 为像guice-xml-config这样的Guice使用基于文件的插件来存储应用程序选项(如果有必要,这将允许稍后配置DI部分。)

您是否建议将Guice用于这两项任务,或者将常规应用程序配置与依赖项注入分开?您认为哪些优点和缺点最重要?

4 个答案:

答案 0 :(得分:33)

在Guice模块中粘贴属性文件很简单:

public class MyModule extends AbstractModule {

  @Override
  protected void configure() {
    try {
        Properties properties = new Properties();
        properties.load(new FileReader("my.properties"));
        Names.bindProperties(binder(), properties);
    } catch (IOException ex) {
        //...
    }
  }
} 

稍后可以轻松地从“属性”切换到其他配置源。

[编辑]

顺便说一句,您可以通过使用@Named("myKey")注释来获取注入的属性。

答案 1 :(得分:3)

检查调控器库:

https://github.com/Netflix/governator/wiki/Configuration-Mapping

您将获得@Configuration注释和几个配置提供程序。在代码中,它有助于查看您使用的配置参数在哪里:

@Configuration("configs.qty.things")
private int   numberOfThings = 10;

此外,您将在启动时获得一个不错的配置报告:

https://github.com/Netflix/governator/wiki/Configuration-Mapping#configuration-documentation

答案 2 :(得分:3)

尝试在maven central上提供Guice configuration,它支持属性,HOCON和JSON格式。

您可以将文件 application.conf 中的属性注入您的服务:

@BindConfig(value = "application")
public class Service {

    @InjectConfig
    private int port;

    @InjectConfig
    private String url;

    @InjectConfig
    private Optional<Integer> timeout;

    @InjectConfig("services")
    private ServiceConfiguration services;
}

您必须将模块 ConfigurationModule 安装为

public class GuiceModule extends AbstractModule {
    @Override
    protected void configure() {
        install(ConfigurationModule.create());
        requestInjection(Service.class);
    }
}

答案 3 :(得分:1)

我在自己的项目中遇到了同样的问题。我们已经选择了Guice作为DI框架并且保持简单,想要将它与配置一起使用。

我们最终使用Apache Commons Configuration从属性文件中读取配置,并将它们绑定到Guice注入器,如Guice FAQ How do I inject configuration parameters?中所示。

@Override public void configure() {
    bindConstant().annotatedWith(ConfigurationAnnotation.class)
        .to(configuration.getString("configurationValue"));    
}

重新加载Commons Configuration支持的配置也非常容易实现Guice注入。

@Override public void configure() {
    bind(String.class).annotatedWith(ConfigurationAnnotation.class)
        .toProvider(new Provider<String>() {
            public String get() {
                return configuration.getString("configurationValue");
            }
    });    
}