【问题标题】:How to inject Scala classes in objects?如何在对象中注入 Scala 类?
【发布时间】:2021-07-05 06:08:11
【问题描述】:

我想在 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) 中返回的实例相同?

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

【问题讨论】:

    标签: scala guice


    【解决方案1】:

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

    没有。就像您在其他地方拨打 new Foo(...) 一样。我的建议是不要混合它;如果你想在MyObject 中使用 Guice 的实例,也可以将其设为 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

    【讨论】:

    • 谢谢!我们使用 Play 框架。我想,我需要从 Play 获取注射器。
    猜你喜欢
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2014-08-15
    相关资源
    最近更新 更多