如何定义"默认"在HK2实施?

时间:2016-03-14 18:12:59

标签: java dependency-injection jersey dependency-management hk2

我使用HK2来解决Jersey / Jetty Web服务中服务的依赖关系。我有一种情况,对于一个特定的接口,我想使用特定的实现作为"默认"实现。按"默认"我的意思是没有名字或限定符 - 如果你没有在字段或参数之上指定任何注释,那就是你得到的。但是,在一些非常具体的情况下,我想提供一个替代实现,它将通过注释进行限定。

由于我的实验,我实际上通过在绑定中使用title = (TextView)findViewById(R.id.TEXTVIEWID); 限定符来可靠地工作。看起来最高等级成为默认等级。但是,我不明白它为什么会起作用,我担心我编写的代码依赖于HK2的未记录的实现细节,当我们更新版本时可能会改变。

这是我正在做的有趣部分的一个人为设想的例子。 ranked()我应该使用什么来指定"默认"和注释的服务变体?我应该使用其他技术吗?

ranked()

1 个答案:

答案 0 :(得分:4)

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

  

如果有多个Widget(例如Widget是一个可以有很多实现的接口),那么最好的Widget将从getService方法返回。 服务的最佳实例是排名最高或服务ID最低的服务。服务的排名可在其描述符中找到,并且可以在运行时随时更改。服务的服务标识是Descriptor绑定到ServiceLocator时系统分配的值。系统分配的值是单调递增的值。因此,如果两个服务具有相同的排名,则最佳服务将与绑定到系统中的最旧描述符相关联。

Source

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