对于用Java编写的监控软件,我考虑使用Google Guice作为DI提供商。项目需要从外部资源(文件或数据库)加载其配置。该应用程序旨在以独立模式或servlet容器运行。
目前,配置不包含依赖项注入的绑定或参数,只有一些全局应用程序设置(JDBC连接定义和关联的数据库管理/监视对象)。
我看到两个选项:
或
您是否建议将Guice用于这两项任务,或者将常规应用程序配置与依赖项注入分开?您认为哪些优点和缺点最重要?
答案 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");
}
});
}