给出3个类:FooA
,FooB
和FooC
,它们都是抽象类Foo
的子类。但是,所有都使用相同的构造函数和依赖注入,所以我使用javax.inject.Provider
来获取完全注入的子类实例。
Provider<FooA> fooAProvider
Provider<FooB> fooBProvider
Provider<FooC> fooCProvider
如何将提供者总结为Provider<Foo> fooProvider
,同时仍然能够获取其子类的实例,还是有另一种方法可以摆脱多个提供者?
答案 0 :(得分:2)
您可以组合生产者和限定符来区分已解决的实例:
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>
个对象的类型安全。