Guice绑定通用对象列表

时间:2013-04-18 17:44:01

标签: java guice

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

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

但是我正在努力使用Types,TypeLiteral等来配置两个Foo实现将赋予Bar的绑定。

1 个答案:

答案 0 :(得分:10)

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

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

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

您可以根据需要展开{​​{1}}的参数列表。一种类似但更冗长的方法是使用提供者:

foos

如果您需要注入OneFoo和TwoFoo的单例列表,可以添加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()); } } 注释。我建议在这一点上使列表不可变:

@Singleton

另一方面,如果你想要一个不注入OneFoo和TwoFoo的单例列表,你可以使用TypeLiteral:

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

在这种情况下,我也建议将列表不可修改。