在 CDI 中指定不同的子类实现

Specifying different subclass implementations in CDI

我有两个class,A和B,需要使用一个服务。有两个服务,S1 和 S2。 S2 扩展 S1。我希望将 S1 注入 class A 并将 S2 注入 class B。我如何在 CDI 中完成此操作?

public class S1 {}
public class S2 extends S1 {}

public class A {
    @Inject S1 service;  //Ambigious?  Could be S1 or S2?
}

public class B {
    @Inject S2 service;
}

@Typed annotation enables restricting bean types 这样你就可以写:

public class S1 {}

@Typed(S2.class)
public class S2 extends S1 {}

public class A {
    @Inject S1 service;
}

public class B {
    @Inject S2 service;
}

在您的部署中,bean class S2beans types 将被限制为 S2Object 因此只有一个 bean bean类型包含类型S1,将解决歧义解析。

请注意,@Typed 注释自 CDI 1.0 起可用。

您也可以依赖限定词,尽管最好使用限定词 功能性 语义。