如何在 HK2 中定义“默认”实现?

Tec*_*ium 2 java dependency-injection jersey dependency-management hk2

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

作为我的实验的结果,我实际上通过ranked()在绑定中使用限定符来可靠地工作。看起来最高等级成为默认值。但是,我不明白它为什么起作用,而且我担心我正在编写依赖于 HK2 未记录的实现细节的代码,当我们更新版本时,该细节可能会发生变化。

这是我正在做的事情的有趣部分的人为示例。ranked()什么,我应该使用指定的“默认”和服务的注释变种?我应该使用另一种技术吗?

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 ... 
    }
}
Run Code Online (Sandbox Code Playgroud)

Tec*_*ium 5

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

如果有多个 Widget(例如 Widget 是一个可以有多种实现的接口),那么最好的 Widget 将从该getService方法中返回。

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

来源

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

  • 是的,这是正确的,hk2 按排名第一选择,其次选择最小的服务 ID,第三选择最大的定位器 ID (2认同)