gpt4 book ai didi

java - 将值绑定(bind)到 Guice 中的两种可能性之一

转载 作者:行者123 更新时间:2023-11-29 05:22:17 26 4
gpt4 key购买 nike

假设我有一个我有默认值的值,如果设置了 System.getProperty("foo") 可以覆盖它。我有一个模块

bindConstant().annotatedWith(Names.named("Default foo")).to(defaultValue);

我想知道实现一个模块的最佳方法是什么,我想将用“foo”注释的东西绑定(bind)到 System.getProperty("foo"),或者,如果它没有存在,“默认 foo”绑定(bind)。

我想到了这样一个简单的模块:

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 创建一个第三个模块的注入(inject)器,它执行“foo”的绑定(bind)。这两者似乎都有其缺点,所以我想知道我是否应该做些不同的事情。我希望有一些东西既不需要注入(inject)器又可以合理地推广到多个“foo”属性。有什么想法吗?

最佳答案

如果您不需要在运行时更改绑定(bind)(即绑定(bind)在注入(inject)器创建时保持不变),那么您的第一个设计对我来说似乎是最佳选择。

对于您在运行时决定的任何值,您都需要一个 Provider 或一个 @Provides 方法:

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;
}
}
}

如果需要在运行时根据参数决定,use this solution .

关于java - 将值绑定(bind)到 Guice 中的两种可能性之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com