Почему я должен использовать guice-hk2-bridge? - PullRequest
0 голосов
/ 22 сентября 2018

Извините за глупый вопрос, но я действительно искал ответ на этот вопрос и не получил однозначного ответа.

Я знаю, что Джерси использует hk2 в качестве DI по умолчанию, и потому что hk2 этопотеря производительности, альтернативный DI - это Guice, который лучше, нам нужно настроить jersey для использования Guice с использованием guice-hk2-bridge.

Вопрос в том, ПОЧЕМУ? Почему нам нужно настроить jersey? Почему мы можемпросто использовать com.google.inject.Inject вместо javax.inject.Inject, используя Guice, импортируя только пакет com.google.inject?

Что такого важного в этом мосту ?, я пытался работать без guice-hk2-bridge иэто прекрасно сработало для меня ... Я уверен, что есть кое-что, что я неправильно понимаю ..

Спасибо

1 Ответ

0 голосов
/ 23 сентября 2018

Я не уверен, сколько у вас опыта программирования с аннотациями, но просто чтобы сообщить, что за ними нет магии.Это просто метаданные, и решать, что делать с этими метаданными, зависит от структуры.Для вас, чтобы сказать "почему мы не можем переключить javax.inject.Inject на com.google.inject.Inject и заставить Guice работать?"демонстрирует непонимание этой концепции.

Любая структура DI построена вокруг контейнера для хранения всех служб, связанных с этой системой.Для HK2 контейнером является ServiceLocator, для Spring - ApplicationContext, а для Guice - Injector.При этом Джерси плотно в сочетании с HK2 1 .Это означает, что поскольку HK2 привязан к контейнеру ServiceLocator, Джерси также привязан к этому ServiceLocator.Поэтому, когда служба просматривается в приложении на Джерси, она просматривается через ServiceLocator.Возьмем, к примеру, следующее

@Path("customers")
public class CustomerResource {
    @Inject
    private CustomerService service;

    @GET
    public List<Customer> findAll() {
        return service.findAll();
    }
}

С учетом вышесказанного, где-то под колпаком, происходит следующее (в псевдокоде), чтобы заставить CustomerService ввести в CustomerResource

ServiceLocator locator = getServiceLocator();
CustomerService service = locator.getService(CustomerService.class);

Когда Джерси создает (управляет жизненным циклом) ресурс (CustomerResource), даже ресурс является услугой, связанной с ServiceLocator.Это то, что я имею в виду, что все в Джерси тесно связано с HK2 и ServiceLocator.

Так что для того, чтобы мы могли представить другую структуру DI, нам нужно подключиться к ServiceLocator.Мост привязывает Guice Injector к HK2 ServiceLocator, чтобы службы в Guice Injector могли быть обнаружены через ServiceLocator.Если бы CustomerService был сервисом, привязанным к Guice Injector, то случилось бы, что Джерси будет искать его в ServiceLocator, а локатор будет искать в Injector.Это то, что делает мост.


1.Начиная с версии 2.26, Джерси разрывает связи с HK2, будучи тесно связанным.Это сложно объяснить, но вкратце, нам все еще нужно использовать HK2 с Джерси, даже если они больше не связаны друг с другом.

...