首页 > 解决方案 > 如何在对象中注入 Scala 类?

问题描述

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

例如,假设我们有 Singleton(使用 Guice)类,如下所示:

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

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

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)返回与 Guice 返回相同的实例@Inject()(foo: Foo)

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

标签: scalaguice

解决方案


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

不,就像你new Foo(...)在别处打电话一样。我的建议是不要混合它;如果你想在里面使用 Guice 的实例MyObject,也可以让它成为一个 Guice 单例类。或者制作Foo一个object,您仍然可以从使用 Guice 的类中访问它。

如果真的需要,我能想到的方式真的很丑;Injector从您的main(或您创建它的任何地方)存储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.


推荐阅读