为什么我应该使用 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,即使它们不再紧密耦合。