如何在对象中注入 Scala 类?

How to inject Scala classes in objects?

我想在 Scala 伴随对象中使用单例 class 但我正在使用 Guice 依赖注入,据我所知,它在这些场景中没有明确的用法。

举个例子,假设我们有单例(使用 Guice)class 如下:

@Singleton
class Foo Inject()(foo2: Foo2) { 
    def func = { ... }
}

我可以在其他 classes 中使用它:

class MyClass Inject()(foo: Foo) { 
   foo.func()
}

对象呢?我需要用 new 创建一个实例为:

object MyObject { 
   val foo2 = new Foo2()
   val foo = new Foo(foo2)
   foo.func()
}

在这种情况下,Foo是否仍然只有一个实例?我的意思是,new Foo(foo2) return 是否与 @Inject()(foo: Foo) 中的 Guice returns 相同?

顺便说一句,已经有关于此的问题(例如,),但我想使用对象并访问其中的单例实例。

In this case, does Foo still have just one instance? I mean, does new Foo(foo2) return the same instance as Guice returns in @Inject()(foo: Foo)?

没有。就像您在别处调用 new Foo(...) 一样。我的建议是不要混合它;如果你想在 MyObject 中使用 Guice 的实例,也将其设为 Guice 单例 class。或者将 Foo 设为 object,您仍然可以使用 classes.

从 Guice 访问它

如果真的需要,我能想到的办法实在是太丑了;将 main(或您创建它的任何地方)中的 Injector 存储在某个 MyObject 可以访问的地方,即

object Main {
  var injector: Injector = null

  def main(args: Array[String]): Unit = {
    // make sure this happens before MyObject is accessed
    injector = Guice.createInjector(...)        
    ...
  }
}

object MyObject { 
  val foo = Main.injector.getInstance(classOf[Foo])
  foo.func()
}

如果您甚至没有自己创建 Injector,而是使用一些使用 Guice 的框架,请检查它是否允许您访问 Injector