在 Guice 中绑定一个集合<String>
Binding a Set<String> in Guice
我想像这样在 Guice 中绑定一个 Set:
public class TestModule extends AbstractModule {
@Override
protected void configure() {
Set<String> testSet = Sets.newHashSet("Hello", "World");
bind(Set.class).annotatedWith(Named.named("Test.Set")).toInstance(testSet);
}
}
我已确保在创建注入器时包含此模块。我稍后尝试使用这个绑定集:
public class TestClass {
@Inject
public NewReleaseRunner(@Named("Test.Set") Set<String> testSet) {
System.out.println(testSet.toString());
}
}
但是,这会导致失败:No implementation for java.util.Set<java.lang.String> annotated with @com.google.inject.name.Named(value=Test.Set) was bound.
我担心 Set<String>
是通用的,但绑定到 Set.class
。我该怎么做才能解决这个问题?
我想你有两个选择。替换
bind(Set.class).annotatedWith(Named.named("Test.Set")).toInstance(testSet);
与
bind(new TypeLiteral<Set<String>>() {}).annotatedWith(Named.named("Test.Set")).toInstance(testSet);
或 删除模块的 configure()
绑定并改为添加
@Provides
@Named("Test.Set")
public Set<String> stringSet() {
return Sets.newHashSet("Hello", "World");
}
我想像这样在 Guice 中绑定一个 Set:
public class TestModule extends AbstractModule {
@Override
protected void configure() {
Set<String> testSet = Sets.newHashSet("Hello", "World");
bind(Set.class).annotatedWith(Named.named("Test.Set")).toInstance(testSet);
}
}
我已确保在创建注入器时包含此模块。我稍后尝试使用这个绑定集:
public class TestClass {
@Inject
public NewReleaseRunner(@Named("Test.Set") Set<String> testSet) {
System.out.println(testSet.toString());
}
}
但是,这会导致失败:No implementation for java.util.Set<java.lang.String> annotated with @com.google.inject.name.Named(value=Test.Set) was bound.
我担心 Set<String>
是通用的,但绑定到 Set.class
。我该怎么做才能解决这个问题?
我想你有两个选择。替换
bind(Set.class).annotatedWith(Named.named("Test.Set")).toInstance(testSet);
与
bind(new TypeLiteral<Set<String>>() {}).annotatedWith(Named.named("Test.Set")).toInstance(testSet);
或 删除模块的 configure()
绑定并改为添加
@Provides
@Named("Test.Set")
public Set<String> stringSet() {
return Sets.newHashSet("Hello", "World");
}