Я использую HK2 для разрешения зависимостей сервисов в веб-сервисе Jersey/Jetty. У меня есть ситуация, когда для одного конкретного интерфейса я хочу использовать конкретную реализацию как реализацию по умолчанию. По умолчанию я имею в виду отсутствие имен или классификаторов - это то, что вы получаете, если не указывать какие-либо аннотации поверх поля или аргумента. Однако в нескольких очень конкретных ситуациях я хочу предоставить альтернативную реализацию, которая будет квалифицироваться с помощью аннотации.Как определить реализацию по умолчанию в HK2?
В результате моих экспериментов я действительно получил это, чтобы надежно работать, используя квалификатор 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 ...
}
}
Да, это правильно, hk2 выбирает по рангу во-первых, наименьший номер службы id и самый большой идентификатор локатора третий – jwells131313
Собственно, то, что я сказал выше, немного ошибочно. Для сортировки он использует ранний первый, самый большой идентификатор локатора второй (так что услуги у детей получают более высокий приоритет) и наименьший идентификатор службы третий. Там действительно есть ошибка в документации на hk2, так как в ней нет упоминания о средней вещи. Я исправлю это – jwells131313