java使用Guice注入复合
假设我有一个接口Foo
。它由具体的实现CompositeFoo
、FooA
、FooB
和FooC
实现。此外,CompositeFoo
如下所示:
public class CompositeFoo implements Foo {
@Inject public CompositeFoo(List<? extends Foo> elements);
}
我希望,在一个Guice PrivateModule
中,将Foo
绑定到一个CompositeFoo
,列表是一个FooA
,后跟一个FooB
或FooC
的东西。(这必须是一个列表,因为顺序很重要;这排除了多绑定作为解决方案的可能性。)
问题是我看到了一些循环。假设CompositeFoo
的提供者如下所示:
public class CompositeFooProvider implements Provider<Foo> {
@Inject private FooA first;
@Inject @Named("Inner") private Foo second;
@Override public Foo get() { return new CompositeFoo(asList(first, second)); }
}
提供第二个Foo
(或者FooB
或者FooC
)的模块如下所示:
public class InnerModule extends PrivateModule {
private final Key<? super Foo> bindingKey; // key will be exposed, bound to the Foo below
// configure() deals with deps of FooB and FooC
@Provides
public Foo getInnerFoo(...) {
// Assume that the args are such that if they are "valid", we should return a FooB, else FooC
if (...) return new FooB(...);
else return new FooC(...);
}
}
当我尝试构造外部模块时,循环性就出现了:我需要安装InnerModule
(作为绑定键传入Key.get(Foo.class, Names.named("Inner"))
),以获得第二个Foo
,但是Foo
由于绑定到CompositeFooProvider
,已经绑定到外部模块中。如何解决这个循环?将@Provides
方法转换为自己的Provider
就足够了吗
# 1 楼答案
@Provides Foo
方法为Foo
提供绑定,该绑定与外部模块中的Foo
绑定冲突。因此,将其绑定为其他内容:或者你也可以这么做
直接输入,而不用麻烦传递绑定密钥