如何在对象中注入 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
。
我想在 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.
如果真的需要,我能想到的办法实在是太丑了;将 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
。