Java 我如何定义“a”;“违约”;在香港实施2?

Java 我如何定义“a”;“违约”;在香港实施2?,java,dependency-injection,jersey,dependency-management,hk2,Java,Dependency Injection,Jersey,Dependency Management,Hk2,我正在使用HK2解决Jersey/Jetty web服务中服务的依赖关系。我有一种情况,对于一个特定的接口,我想使用一个特定的实现作为“默认”实现。默认情况下,我指的是没有名称或限定符-如果您不在字段或参数顶部指定任何注释,则会得到这些名称或限定符。然而,在一些非常特殊的情况下,我想提供一个替代实现,该实现将使用注释进行限定 作为实验的结果,通过在绑定中使用ranged()限定符,我实际上已经让它可靠地工作了。最高等级似乎成为默认等级。然而,我不明白它为什么能工作,我担心我正在编写的代码依赖于H

我正在使用HK2解决Jersey/Jetty web服务中服务的依赖关系。我有一种情况,对于一个特定的接口,我想使用一个特定的实现作为“默认”实现。默认情况下,我指的是没有名称或限定符-如果您不在字段或参数顶部指定任何注释,则会得到这些名称或限定符。然而,在一些非常特殊的情况下,我想提供一个替代实现,该实现将使用注释进行限定

作为实验的结果,通过在绑定中使用
ranged()
限定符,我实际上已经让它可靠地工作了。最高等级似乎成为默认等级。然而,我不明白它为什么能工作,我担心我正在编写的代码依赖于HK2的未记录的实现细节,当我们更新版本时,这些细节可能会发生变化

这里有一个我正在做的有趣部分的人为例子我应该使用什么来指定服务的“默认”和带注释的变体?我应该使用另一种技术吗?

public interface IFoo {
    public String getString();
}

public class DefaultImpl implements IFoo {
    public String getString() {
        return "Default Implementation";
    }
}

public class AnnotatedImpl implements IFoo {
    public String getString() {
        return "Annotated Implementation";
    }
}

public class Bindings extends AbstractBinder {

     @Override
     public void configure() {
         ServiceBindingBuilder<DefaultImpl> defaultImpl =
             bind(DefaultImpl.class)
                 .to(IFoo.class);

         defaultImpl.ranked(9);

         ServiceBindingBuilder<AnnotatedImpl> annotatedImpl =
             bind(AnnotatedImpl.class)
                 .qualifiedBy(new MyAnnotationQualifier())
                 .to(IFoo.class);

         annotatedImpl.ranked(1);
     }
}

public class MyService {

    @Inject
    public MyService(
        IFoo defaultImplementation,
        @MyAnnotation
        IFoo annotatedImplementation) {

        // ... my code here ... 
    }
}
公共接口IFoo{
公共字符串getString();
}
公共类DefaultImpl实现IFoo{
公共字符串getString(){
返回“默认实现”;
}
}
公共类dimpl实现了IFoo{
公共字符串getString(){
返回“带注释的实现”;
}
}
公共类绑定扩展了AbstractBinder{
@凌驾
public void configure(){
ServiceBindingBuilderDefaultImpl=
绑定(DefaultImpl.class)
.to(IFoo.class);
违约违约率排名(9);
ServiceBindingBuilder注释DIMPL=
绑定(注释dimpl.class)
.qualifiedBy(新的MyAnnotationQualifier())
.to(IFoo.class);
排名第1位;
}
}
公共类MyService{
@注入
公共MyService(
IFoo defaultImplementation,
@MyAnnotation
IFoo注释(实施){
//…我的代码在这里。。。
}
}

我在HK2网站上偶然发现了一些与我看到的行为一致的文档

如果有多个小部件(例如,小部件是一个可以有许多实现的接口),那么最好的小部件将从
getService
方法返回

服务按(顺序)服务排名、最大定位器id(以便在选择父服务之前选择子服务)和最小服务id(以便选择较旧的服务之前选择较新的服务)排序。因此,服务的最佳实例是具有最高排名或最大服务定位器id或最低服务id的服务。服务的排名可在其中找到,并可在运行时随时更改。服务的定位器id是系统为绑定到中时分配的值,是该服务的id。服务的服务id是系统为绑定到中时分配的值。系统赋值是一个单调递增的值。因此,如果两个服务具有相同的排名,那么最好的服务将与系统中最早的绑定相关联


因此,我在绑定上正确使用了
ranged()
。这是控制HK2定义为“默认”(或“最佳”)的服务注入我的依赖服务的两种方法之一。

是的,这是正确的,HK2按排名第一、最小服务id第二、最大定位器id第三选择。实际上,我上面说的有点错误。对于排序,它使用排名第一、最大的定位器id第二(这样子级中的服务获得更高的优先级)和最小的服务id第三。实际上,这里的hk2文档中有一个bug,因为它没有提到中间的东西。我会解决的