gpt4 book ai didi

java - 通用对象列表的 Guice 绑定(bind)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:18 26 4
gpt4 key购买 nike

我需要告诉 guice 我想要一个 OneFoo 和一个 TwoFoo 作为 Foo 列表注入(inject) Bar 的绑定(bind)语句是什么?这里的设置是一个责任链。现在我有两个实现,但 Bar 不需要知道。

@Inject
Bar(List<Foo> foos) {...}
...
class OneFoo implements Foo {
@Inject
OneFoo(...) {...}
...
class TwoFoo implements Foo {
@Inject
TwoFoo(...) {...}

但我正在努力使用类型、TypeLiteral 等来配置将两个 Foo 实现提供给 Bar 的绑定(bind)。

最佳答案

如果您在编译时知道绑定(bind),则可以在模块中使用 @Provides 方法:

class MyModule extends AbstractModule() {
@Override
protected void configure() {
// ...
}

@Provides
@Inject
public List<Foo> foos(OneFoo one, TwoFoo two) {
return Arrays.asList(one, two);
}
}

您可以根据需要扩展foos 的参数列表。一种类似但更冗长的方法是使用 Provider:

protected void configure() {
bind(new TypeLiteral<List<Foo>>() {})
.toProvider(FooListProvider.class);
}

static class FooListProvider implements Provider<List<Foo>> {
@Inject
Provider<OneFoo> one;
@Inject
Provider<TwoFoo> two;

public List<Foo> get() {
return Arrays.asList(one.get(), two.get());
}
}

如果你想要一个注入(inject)了 OneFoo 和 TwoFoo 的单例列表,你可以添加一个 @Singleton 注释。我建议此时也使列表不可变:

@Singleton
@Provides
@Inject
public List<Foo> foos(OneFoo one, TwoFoo two) {
return Collections.unmodifiableList(Arrays.asList(one, two));
}

另一方面,如果您想要一个没有注入(inject) OneFoo 和 TwoFoo 的单例列表,您可以使用 TypeLiteral:

@Override
protected void configure() {
bind(new TypeLiteral<List<Foo>>() {})
.toInstance(Arrays.asList(new OneFoo(), new TwoFoo()));
}

同样,在这种情况下,我建议将列表设置为不可修改。

关于java - 通用对象列表的 Guice 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16089767/

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