【问题标题】:Get multiple new instances with 0 coupling to Guice获取多个与 Guice 0 耦合的新实例
【发布时间】:2011-04-21 12:57:57
【问题描述】:

我创建了一个类,它使用 Java Executor API 创建/管理具有固定线程数的池。 每个线程都需要一个特定对象的新实例,我想用 Guice 注入这个对象。 目前我正在使用一个提供者,它通过它的 get() 方法提供对象的新实例。

但是现在这个类对 Provider 有依赖,这是 Guice 特有的,有效地将代码耦合到 Guice 框架。 我真的希望这个类是真正的 Guice 不可知论者,这可能吗?

仅使用“new”关键字创建新实例不是一种选择,因为这使得无法在单元测试中用模拟实现替换这些对象。

依赖注入可能不适合这个,我最好创建一个工厂来获取这些对象?

【问题讨论】:

    标签: java dependency-injection ioc-container guice


    【解决方案1】:

    如果您希望 Guice 为您注入对象,您的对象将与 Guice 耦合。这就是 Guice 的工作方式。您可以通过创建自己的 Factory 接口并注入它来绕过使用 Provider 接口,但您仍然必须在某个地方有一个 @Inject 来将您耦合到 Guice。

    我个人认为你应该重新考虑你对 Guice 0 耦合的要求,但如果你绝对必须能够编写不引用你的 DI 容器的类,你应该看看 Spring 之类的东西。

    【讨论】:

    • 是的,我查看了使用 cglib 在运行时覆盖方法的 Spring 查找方法,这与我想要的非常接近。但是没有必要让类 100% Guice 不可知,我只是好奇 :) 我想我会坚持使用 Provider。
    • 我不确定您所说的“您是 [原文如此] 对象将与 Guice 耦合”是什么意思。 Guice 可以注入完全在 Guice 之外创建和维护的对象(通过创建 Provider)。
    • @erickson,这是真的,但是你的代码中要使用该类的部分要么必须耦合到 Injector 或 Provider。我想我要说的是,如果你想使用 Guice,你的代码库中会有一部分与它耦合,那么为什么这个特定的 Runnable 类不如此重要呢?与 Guice 耦合?
    • 我明白你的意思。是的,在某个级别(通常是非常高的级别,例如在初始化应用程序时),当然您将不得不创建一个 Guice Injector 并从中获取实例。当像这样启动一个新线程时,很有可能会产生这种直接依赖关系。
    【解决方案2】:

    您可能需要考虑的一件事是从主干构建 Guice 并使用它直到 Guice 3.0 发布。然后你可以用JSR-330javax.inject.Provider代替Guice的。

    编辑:除此之外,我通常认为耦合到 DI 容器(在这种情况下,通过从 com.google.inject 导入某些内容)有时比人们更容易解决让它成为。只要您不依赖于如何获取依赖项的详细信息(例如,到处注入Injector),就可以很容易地更改注入Provider 的所有位置以使用您自己的接口一个类似的功能。依赖于强大的功能,比如作用域,是你真正将自己与容器耦合的地方。我认为这也很好,因为它们为您节省了多少丑陋和努力。

    【讨论】:

    • 我已经这样做了,效果很好。只有模块依赖于 Guice。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    相关资源
    最近更新 更多