Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将值绑定到Guice中的两种可能性之一_Java_Guice - Fatal编程技术网

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;
        }
    }
}
如果您需要在运行时根据参数做出决定