为什么要使用guice-hk2-bridge?

时间:2018-09-21 22:44:07

标签: java jersey guice hk2

对于这个愚蠢的问题,我们感到抱歉,但是我确实在寻找这个问题的答案,但是没有一个清楚的答案。

我知道球衣使用hk2作为默认DI,并且因为hk2是性能损失,所以替代DI是Guice,这更好,我们需要使用guice-hk2-bridge将球衣配置为使用Guice。

问题是为什么?为什么我们需要配置运动衫?为什么我们不能只通过导入com.google.inject.Inject包而使用Guice使用javax.inject.Inject而不是com.google.inject

这座桥有什么重要意义?我试图在没有guice-hk2-bridge的情况下工作,并且对我来说效果很好...我确定我误会了..

谢谢

1 个答案:

答案 0 :(得分:3)

我不确定您有多少使用注释进行编程的经验,但是只是让您知道,它们背后没有魔术。它们只是元数据,由框架决定如何处理该元数据。您说“为什么我们不能将javax.inject.Inject的{​​{1}}切换为Guice呢?”表示对该概念缺乏了解。

任何DI框架都是围绕容器构建的,以容纳绑定到该系统的所有服务。对于HK2,容器是com.google.inject.Inject,对于Spring,容器是ServiceLocator,对于Guice,容器是ApplicationContext。话虽如此,泽西岛紧密与HK2 1 结合在一起。这意味着,因为HK2绑定到Injector容器,泽西岛也绑定到此ServiceLocator。因此,当在Jersey应用程序中查找服务时,将通过ServiceLocator查找该服务。以下面的例子为例

ServiceLocator

有了上面的代码,在引擎盖下的某个地方,下面的代码(以伪代码形式)正在进行,以使@Path("customers") public class CustomerResource { @Inject private CustomerService service; @GET public List<Customer> findAll() { return service.findAll(); } } 注入CustomerService

CustomerResource

当我们让Jersey创建(管理生命周期)资源(ServiceLocator locator = getServiceLocator(); CustomerService service = locator.getService(CustomerService.class); )时,即使资源也是绑定在CustomerResource中的服务。这就是我的意思,泽西岛的所有事物都与HK2和ServiceLocator紧密相连。

因此,为了让我们引入另一个DI框架,我们需要使用ServiceLocator。桥接器的作用是将Guice ServiceLocator与HK2 Injector绑定在一起,以便可以通过ServiceLocator发现Guice Injector中的服务。如果ServiceLocator是绑定到Guice CustomerService的服务,则将发生的情况是Jersey将在Injector中寻找它,而定位器将在{{1}中寻找} 为了它。这就是桥所要做的。


1。从版本2.26开始,Jersey实际上与HK2紧密相连,从而打破了联系。解释起来很复杂,但是总之,即使它们不再紧密耦合,我们仍然需要使用HK2和Jersey。