Я не уверен, сколько у вас опыта программирования с аннотациями, но просто чтобы сообщить, что за ними нет магии.Это просто метаданные, и решать, что делать с этими метаданными, зависит от структуры.Для вас, чтобы сказать "почему мы не можем переключить 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 с Джерси, даже если они больше не связаны друг с другом.