Java:如何在依赖注入中的提供程序中获取子类



给定3个类:FooAFooBFooC,它们都是抽象类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>

最新更新