为什么我应该使用 guice-hk2-bridge?
Why should i use guice-hk2-bridge?
很抱歉这个愚蠢的问题,但我真的在寻找这个问题的答案,但没有得到一个明确的答案。
我知道 jersey 使用 hk2 作为默认 DI,因为 hk2 是性能损失,替代 DI 是 Guice 哪个更好,我们需要使用 guice-hk2-bridge 配置 jersey 以使用 Guice。
问题是为什么?,为什么我们需要配置球衣?,为什么我们不能只使用 com.google.inject.Inject
而不是 javax.inject.Inject
,通过仅导入 com.google.inject
使用 Guice包?
这座桥有什么重要的?,我尝试在没有 guice-hk2-bridge 的情况下工作,它对我来说非常完美......我确定我误解了一些东西......
谢谢
我不确定您有多少使用注释进行编程的经验,但只是想让您知道,它们背后没有魔法。它们只是元数据,由框架决定如何处理该元数据。你说"why can't we switch javax.inject.Inject
for com.google.inject.Inject
and make Guice work?"说明对这个概念缺乏理解。
任何 DI 框架都是围绕容器构建的,以容纳绑定到该系统的所有服务。对于HK2,容器是ServiceLocator
,对于Spring,容器是ApplicationContext
,对于Guice,容器是Injector
。也就是说,泽西岛 与 HK21 紧密结合。这意味着因为 HK2 绑定到 ServiceLocator
容器,所以 Jersey 也绑定到这个 ServiceLocator
。因此,当在 Jersey 应用程序中查找服务时,将通过 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);
当我们让 Jersey 创建(管理其生命周期)资源 (CustomerResource
) 时,甚至资源也是绑定在 ServiceLocator
中的服务。这就是我的意思,泽西岛的一切都与 HK2 和 ServiceLocator
.
紧密耦合
因此,为了让我们引入另一个 DI 框架,我们需要利用 ServiceLocator
。 bridge 所做的是将 Guice Injector
绑定到 HK2 ServiceLocator
,以便可以通过 ServiceLocator
发现 Guice Injector
中的服务。如果 CustomerService
是绑定到 Guice Injector
的服务,那么 Jersey 会在 ServiceLocator
中查找它,定位器会在 [=16= 中查找] 为了它。这就是桥的作用。
1.从 2.26 版开始,Jersey 实际上打破了与 HK2 的紧耦合关系。解释起来比较复杂,但总之,我们仍然需要使用 HK2 和 Jersey,即使它们不再紧密耦合。
很抱歉这个愚蠢的问题,但我真的在寻找这个问题的答案,但没有得到一个明确的答案。
我知道 jersey 使用 hk2 作为默认 DI,因为 hk2 是性能损失,替代 DI 是 Guice 哪个更好,我们需要使用 guice-hk2-bridge 配置 jersey 以使用 Guice。
问题是为什么?,为什么我们需要配置球衣?,为什么我们不能只使用 com.google.inject.Inject
而不是 javax.inject.Inject
,通过仅导入 com.google.inject
使用 Guice包?
这座桥有什么重要的?,我尝试在没有 guice-hk2-bridge 的情况下工作,它对我来说非常完美......我确定我误解了一些东西......
谢谢
我不确定您有多少使用注释进行编程的经验,但只是想让您知道,它们背后没有魔法。它们只是元数据,由框架决定如何处理该元数据。你说"why can't we switch javax.inject.Inject
for com.google.inject.Inject
and make Guice work?"说明对这个概念缺乏理解。
任何 DI 框架都是围绕容器构建的,以容纳绑定到该系统的所有服务。对于HK2,容器是ServiceLocator
,对于Spring,容器是ApplicationContext
,对于Guice,容器是Injector
。也就是说,泽西岛 与 HK21 紧密结合。这意味着因为 HK2 绑定到 ServiceLocator
容器,所以 Jersey 也绑定到这个 ServiceLocator
。因此,当在 Jersey 应用程序中查找服务时,将通过 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);
当我们让 Jersey 创建(管理其生命周期)资源 (CustomerResource
) 时,甚至资源也是绑定在 ServiceLocator
中的服务。这就是我的意思,泽西岛的一切都与 HK2 和 ServiceLocator
.
因此,为了让我们引入另一个 DI 框架,我们需要利用 ServiceLocator
。 bridge 所做的是将 Guice Injector
绑定到 HK2 ServiceLocator
,以便可以通过 ServiceLocator
发现 Guice Injector
中的服务。如果 CustomerService
是绑定到 Guice Injector
的服务,那么 Jersey 会在 ServiceLocator
中查找它,定位器会在 [=16= 中查找] 为了它。这就是桥的作用。
1.从 2.26 版开始,Jersey 实际上打破了与 HK2 的紧耦合关系。解释起来比较复杂,但总之,我们仍然需要使用 HK2 和 Jersey,即使它们不再紧密耦合。