Java:如何在依赖注入中获取Provider中的SubClasses

时间:2018-05-09 08:59:17

标签: java

给出3个类:FooAFooBFooC,它们都是抽象类Foo的子类。但是,所有都使用相同的构造函数和依赖注入,所以我使用javax.inject.Provider来获取完全注入的子类实例。

Provider<FooA> fooAProvider
Provider<FooB> fooBProvider
Provider<FooC> fooCProvider

如何将提供者总结为Provider<Foo> fooProvider,同时仍然能够获取其子类的实例,还是有另一种方法可以摆脱多个提供者?

1 个答案:

答案 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>个对象的类型安全。