给定3个类:FooA
、FooB
和FooC
,它们都是抽象类Foo
的子类。但是,所有这些都使用相同的构造函数和依赖注入,所以我使用javax.inject.Provider
来获取子类的完全注入实例。
Provider<FooA> fooAProvider
Provider<FooB> fooBProvider
Provider<FooC> fooCProvider
我怎样才能将提供程序相加以成为Provider<Foo> fooProvider
,同时仍然能够获取其子类的实例,或者有没有其他方法可以摆脱多个提供程序?
您可以组合生产者和限定符来区分已解析的实例:
public class ProviderSuppliers {
@Producer
@Named("fooA")
public static Provider<Foo> getFooA() {
return //create Provider for FooA
}
@Producer
@Named("fooB")
public static Provider<Foo> getFooB() {
return //create Provider for FooB
}
@Producer
@Named("fooC")
public static Provider<Foo> getFooC() {
return //create Provider for FooC
}
}
然后,您可以使用限定符注入它们:
@Inject
@Named("fooA")
Provider<FooA> fooAProvider
@Inject
@Named("fooB")
Provider<FooB> fooBProvider
//and so on
现在,在Provider<Foo>
:这有点问题,因为从技术上讲,您无法执行此操作:
Provider<Foo> fooA = new Provider<FooA>(); //you can't assign like this.
但是,您仍然可以声明如下,并且仍然通过注入预期的实例来使其工作(限定符会处理这个问题(
@Inject
@Named("fooA")
Provider<Foo> fooAProvider
这实际上是不好的,因为您只是在绕过类型安全。更好的方法是只在生产者和注入点声明相同的类型,这也有助于在实际使用对象的情况下实现类型安全Provider<FooX>
。