【问题标题】:Guice: How to get instance of Singleton without injector or using Constructor InjectionGuice:如何在没有注入器或使用构造函数注入的情况下获取单例实例
【发布时间】:2013-07-05 16:17:20
【问题描述】:

我有一个单例类定义为:

@Singleton
class MySingletonClass{
   ....
}

我有另一个类使用这个单例类,但是这个类必须使用 new 运算符创建。因此我不能使用构造函数注入或设置器注入等。

class MyClass {
   public void method() {
       // Uses instnace of MySingletonClass
   }
}

我当然可以将 this 的一个实例传递给 MyClass 的构造函数,但从我的程序上下文来看,它并不是一个很好的设计。

另一个解决方案是为 MySingletonClass 创建一个静态 getInstance 方法,以便我可以从程序中的任何位置获取实例。但我想知道Guice是否支持类似的东西?我确信 Guice 可以允许在任何地方获取单例实例。

非常感谢。

【问题讨论】:

  • 我确信 Guice 可以允许在任何地方获取单例实例。 Guice 是一个 DI 容器,因此它允许魔法发生,但仅限于容器内部,而这个容器是 @ 987654323@ 实例。您必须隐式(从容器内部,例如通过构造函数注入)或显式(getInstance() 方法)访问它。因此,您必须将您的类置于 DI 控制之下或手动传递您的依赖项。第一个解决方案显然更好。
  • 感谢您的回复。注入器实例应该在应用程序的最顶层(例如 main 方法)中全局创建一次。但是有没有什么方法可以在应用程序的任何地方获取 Injector 实例,而无需将在 main 方法中创建的实例显式传递给所有类?
  • 不,没有。 Injector 毕竟是一个简单的对象。顺便说一句,可以有多个注入器,它们可以形成层次结构。那么,哪一个应该在整个程序中可用?获得Injector 实例而不显式传递它的唯一方法是将其注入其中一个托管类。

标签: java dependency-injection guice


【解决方案1】:

我认为如果myClass需要MySingletonClass,这意味着它们之间存在明显的依赖关系,因此正确的解决方案是将MySingletonClass的实例传递给MyClass的构造函数。

构造函数注入是最理想的注入方法之一,因为它使依赖项显式化并防止创建具有不满足依赖项的 MyClass。 如果你真的不喜欢构造函数注入,你总是可以使用 setter 注入,你可以手动注入 MySingletonClass 的实例。

【讨论】:

  • 感谢您的回答。我的代码设计禁止将 MySingltonClass 的实例传递给 MyClass。另外,我想知道我是否可以在任何地方使用 Guice 的注射器?如果是这样,我可以简单地调用 injector.getInstance(MySingletonClass.class)。
  • 这很有趣,但 Guice 确实允许获取注入器,但它也必须像任何其他依赖项一样注入。如果你真的不能改变你的代码来使用依赖注入,那么你最好的选择是将你的单例手动传递给实例化的类。如果这个类不仅仅依赖这个单例,你可以试试on-demand injection
猜你喜欢
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多