Java 将值绑定到Guice中的两种可能性之一
假设我有一个默认值,如果设置了Java 将值绑定到Guice中的两种可能性之一,java,guice,Java,Guice,假设我有一个默认值,如果设置了System.getProperty(“foo”),则可以覆盖该值。我有一个模块,我有 bindConstant().annotatedWith(Names.named("Default foo")).to(defaultValue); 我想知道实现一个模块的最佳方法是什么,对于这个模块,我想将带有“foo”注释的东西绑定到System.getProperty(“foo”),或者,如果它不存在,“Default foo”绑定 我想到了这样一个简单的模块: publ
System.getProperty(“foo”)
,则可以覆盖该值。我有一个模块,我有
bindConstant().annotatedWith(Names.named("Default foo")).to(defaultValue);
我想知道实现一个模块的最佳方法是什么,对于这个模块,我想将带有“foo”注释的东西绑定到System.getProperty(“foo”)
,或者,如果它不存在,“Default foo”绑定
我想到了这样一个简单的模块:
public class SimpleIfBlockModule extends AbstractModule {
@Override
public void configure() {
requireBinding(Key.get(String.class, Names.named("Default foo")));
if (System.getProperties().containsKey("foo")) {
bindConstant().annotatedWith(Names.named("foo")).to(System.getProperty("foo"));
} else {
bind(String.class).annotatedWith(Names.named("foo")).to(Key.get(String.class, Names.named("Default foo")));
}
}
}
public class SystemPropertyModule extends PrivateModule {
@Override
public void configure() {
Names.bindProperties(binder(), System.getProperties());
if (System.getProperties().contains("foo")) {
expose(String.class).annotatedWith(Names.named("foo"));
}
}
}
我还考虑创建一个“系统属性模块”,如下所示:
并使用
SystemPropertyModule
创建一个注入器,该注入器包含第三个模块,该模块执行“foo”的绑定。这两者似乎都有其缺点,所以我想知道是否有什么我应该做的不同。我希望有一些东西既不需要注入器,又可以合理地概括为多个“foo”属性。有什么想法吗?如果您不需要在运行时更改绑定,那么您的第一个设计对我来说似乎是最好的选择(即绑定在创建时是恒定的)
对于运行时确定的任何值,都需要提供程序或@提供的方法:
public class SimpleIfBlockModule extends AbstractModule {
@Override public void configure() { }
@Provides @Named("foo") String provideFoo(
@Named("Default foo") String defaultFoo,
AnyInjectableDependencyHere ifNeeded) {
if (System.getProperties().containsKey("foo")) {
return System.getProperty("foo");
} else {
return defaultFoo;
}
}
}
如果您需要在运行时根据参数做出决定