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)
我在 HK2 的网站上偶然发现了一些与我所看到的行为一致的文档。
如果有多个 Widget(例如 Widget 是一个可以有多种实现的接口),那么最好的 Widget 将从该
getService方法中返回。服务按(按顺序)服务排名、最大的定位符 id(以便在父服务之前选择儿童服务)和最小服务 id(以便在较新服务之前选择较旧服务)进行排序。因此,服务的最佳实例是具有最高排名或最大服务定位符 id 或最低服务 id 的服务。服务的排名
Descriptor可以在其中找到,并且可以在运行时随时更改。服务的定位符 id 是系统分配的值,用于将Descriptor其绑定到ServiceLocator并且是该 的 idServiceLocator。服务的服务 id 是系统分配的值,用于将Descriptor其绑定到ServiceLocator. 系统赋值是一个单调递增的值。因此,如果两个服务具有相同的排名,则最佳服务将与Descriptor进入系统的最早绑定相关联。
因此,我ranked()在我的绑定上正确使用。它是控制 HK2 定义为“默认”(或“最佳”)服务以注入我的依赖服务的两种方法之一。
| 归档时间: |
|
| 查看次数: |
846 次 |
| 最近记录: |