1

Я использую 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 ... 
    } 
} 

ответ

2

я наткнулся на какой-то документации на веб-сайте ¯hk2, что согласуется с поведением, что я вижу.

Если есть более одного виджета (например, виджет - это интерфейс, который может иметь множество реализаций), то лучший метод будет возвращен из метода getService. Лучший экземпляр службы - это сервис с наивысшим рейтингом или самым низким идентификатором службы. Ранжирование службы находится в дескрипторе и может быть изменено в любое время во время выполнения. Идентификатор службы службы - это системное назначенное значение для дескриптора, когда оно связано с ServiceLocator. Системное присвоенное значение является монотонно увеличивающимся значением. Таким образом, если две службы имеют одинаковый рейтинг, лучший сервис будет связан с самым старым дескриптором, связанным с системой.

Source

Поэтому я использую ranked() на моих привязок правильно. Это один из двух способов контролировать то, что HK2 определяет как услугу «по умолчанию» (или «лучший») для ввода в мои зависимые службы.

+1

Да, это правильно, hk2 выбирает по рангу во-первых, наименьший номер службы id и самый большой идентификатор локатора третий – jwells131313

+1

Собственно, то, что я сказал выше, немного ошибочно. Для сортировки он использует ранний первый, самый большой идентификатор локатора второй (так что услуги у детей получают более высокий приоритет) и наименьший идентификатор службы третий. Там действительно есть ошибка в документации на hk2, так как в ней нет упоминания о средней вещи. Я исправлю это – jwells131313

Смежные вопросы