@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());
}
}
如果你想要一个注入 OneFoo 和 TwoFoo 的单例列表,你可以添加一个@Singleton
注解。我建议此时也使列表不可变:
@Singleton
@Provides
@Inject
public List<Foo> foos(OneFoo one, TwoFoo two) {
return Collections.unmodifiableList(Arrays.asList(one, two));
}
另一方面,如果您想要一个未注入 OneFoo 和 TwoFoo 的单例列表,则可以使用 TypeLiteral:
@Override
protected void configure() {
bind(new TypeLiteral<List<Foo>>() {})
.toInstance(Arrays.asList(new OneFoo(), new TwoFoo()));
}
在这种情况下,我再次建议使列表不可修改。