23

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

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

我看到两个选项:

或者

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

您会建议将 Guice 用于这两个任务,还是将通用应用程序配置与依赖注入分开?您认为哪些优点和缺点最重要?

4

4 回答 4

37

在 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").

于 2011-01-26T14:58:20.630 回答
5

检查州长库:

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

于 2014-01-24T13:36:05.813 回答
4

试试maven Central 上的Guice 配置,它支持属性、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);
    }
}
于 2015-12-23T18:07:11.783 回答
2

我在自己的项目中遇到了同样的问题。我们已经选择 Guice 作为 DI 框架,为了简单起见,我们还想在配置中使用它。

我们最终使用Apache Commons Configuration从属性文件中读取配置并将它们绑定到 Guice 注入器,如 Guice FAQ 中建议的如何注入配置参数?.

@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");
            }
    });    
}
于 2013-06-20T04:46:41.980 回答