【问题标题】:Working of Google's Guice with Dropwizard使用 Dropwizard 使用 Google 的 Guice
【发布时间】:2025-11-24 02:35:01
【问题描述】:

我浏览了 Guice 的 official documentation,它说我们需要创建一个包含所有 Guice 模块的注入器,然后调用类似:

  Injector injector = Guice.createInjector(new BillingModule());
    BillingService billingService = injector.getInstance(BillingService.class);

但是当我通过dropwizard-guiceexample。它正在创建 GuiceBundle 并将其添加到 bootstrap

bootstrap.addBundle(guiceBundle);

我想了解它是如何将代码中任何地方编写的 @Inject 与 Guice 捆绑包提供的实例链接起来的内部工作。

【问题讨论】:

  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次问多个不同的问题。请参阅“如何提问”页面以获得澄清此问题的帮助。

标签: java dependency-injection guice dropwizard


【解决方案1】:

Dropwizard 与带有自己的 HK2 DI 的 Jersey 捆绑在一起。

如果您尝试使用答案中提到的 Guice 注入,Guice 将拥有自己的模块上下文,HK2 模块将无法使用这些上下文。

要使上述方法起作用,需要一个库来在它们之间架起一座桥梁。 HubSpot/dropwizard-guice 就是这样一个桥接库。这必须在应用程序的引导阶段完成,以便在初始化 Jersey 时,HK2 知道 Guice 模块。

可以参考以下链接了解更多信息:

https://javaee.github.io/hk2/guice-bridge.html

Guice don't inject to Jersey's resources

【讨论】:

  • 能否分享更多关于 dropwizard-guice 内部与 HK2 合作的见解
  • @niraj 我已经更新了我的答案以包含有助于理解 hk2 guice 桥以及如何实现桥的链接。
【解决方案2】:

您需要告诉 HubSpot 的 GuiceBundle 在哪里寻找资源类。
我想,在 Guice 之前,您必须将同样的事情告诉泽西岛。
这是我用来初始化 GuiceBundle 的一段代码
(假设我所有的资源类都在同一个包中):

GuiceBundle<MyConfiguration> guiceBundle =
        GuiceBundle.<MyConfiguration>newBuilder()
                .addModule(new MyModule())
                .enableAutoConfig(MyResource.class.getPackage().getName())
                .setConfigClass(MyConfiguration.class)
                .build();

【讨论】:

  • 所以,如果我在某个类中使用@Inject 并且我正在创建它的一个实例。 GuiceBundle 出现在哪里?我如何接收注入的实例?
  • GuiceBundle 来自上面提到的 HubSpot 的dropwizard-guice。一旦你为你的对象树的资源、服务和任何其他类添加了带有 @Inject 注释的构造函数、设置器或字段,Guice 应该能够完成它的工作。请查看 dropwizard-guice 的自述文件(上面的链接)了解更多详细信息。