scala - 如何在对象中注入 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)
?
顺便说一句,已经有关于这个的问题(例如,链接),但我想使用对象并访问其中的单例实例。
解决方案
在这种情况下,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
.
推荐阅读
- android - setVisibility 不适用于 tabLayout - TabItem 为 findViewById() 返回 NullPointerException
- r - aov 和 t.test 提供不同的结果
- pandas - 是否可以使用 `style.apply()` 函数来改变很少的样式属性?
- python - sftp 到 aws lightail python 使用 pysftp 密钥错误
- node.js - 如何在 PDF 中嵌入和提取任意数据?
- google-cloud-platform - 谷歌云数据包镜像服务:内部负载均衡器的MAC地址
- css - 延迟输入占位符重新出现
- javascript - 向 Express JS 服务器发出 POST 请求时出错
- mysql - 在 EF Plus Core Audit 中存储 Always Encrypted 列值
- javascript - Microsoft Teams:保存/检索配置设置时出错