Guice和通用应用程序配置

24

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

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

我看到两个选择:

或者

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

您是否建议同时使用Guice执行这两个任务,还是将通用应用程序配置与依赖项注入分开?您认为哪些优缺点最重要?

4个回答

38

在 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) {
        //...
    }
  }
} 

稍后可以轻松地从 Properties 切换到其他配置源。

[编辑]

另外,您可以通过使用 @Named("myKey") 对其进行注释来获取已注入的属性。


1
+1 我认为你也应该提到如何使用 @Named 注入属性。 - ColinD

5

4
尝试使用Maven中央库提供的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);
    }
}

2
我在自己的项目中遇到了同样的问题。我们已经选择了Guice作为DI框架,并希望使用它来进行配置,以保持简单。
最终,我们使用Apache Commons Configuration从属性文件中读取配置,并像Guice FAQ中建议的那样将它们绑定到Guice注入器中(如何注入配置参数?)
@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");
            }
    });    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接