对于这个愚蠢的问题,我们感到抱歉,但是我确实在寻找这个问题的答案,但是没有一个清楚的答案。
我知道球衣使用hk2作为默认DI,并且因为hk2是性能损失,所以替代DI是Guice,这更好,我们需要使用guice-hk2-bridge将球衣配置为使用Guice。
问题是为什么?为什么我们需要配置运动衫?为什么我们不能只通过导入com.google.inject.Inject
包而使用Guice使用javax.inject.Inject
而不是com.google.inject
?
这座桥有什么重要意义?我试图在没有guice-hk2-bridge的情况下工作,并且对我来说效果很好...我确定我误会了..
谢谢
答案 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。