gpt4 book ai didi

scala - 使用 Scala Guice 将特征绑定(bind)到对象

转载 作者:行者123 更新时间:2023-12-01 02:20:58 24 4
gpt4 key购买 nike

这将是一个关于如何让绑定(bind)工作的问题,但是在清理我准备发布的示例时,我实际上已经设法让它工作 - 问题是我不知道为什么会这样:

import org.specs2.mutable._
import com.google.inject.{ Inject, Module, Binder, Guice }
import net.codingwell.scalaguice.ScalaModule

object InjectorSpec extends Specification {
val injector = Guice.createInjector(new ScalaModule() {
def configure() {
bind[Message].toInstance(MessageImpl)
bind[MessageService.type].toInstance(MessageService) // This line makes it work?
}
})

trait Message {
val body: String
}

object MessageImpl extends Message {
val body: String = "Hello!"
}

object MessageService {
@Inject
val message: Message = null

def get = message.body
}

"MessageService" should {
"Inject Message Implementation" in {
MessageService.get mustEqual "Hello!"
}
}
}

最初我只是绑定(bind)要注入(inject)的类型(为 Message 注入(inject) MessageImpl)。在途中的某个地方,我拿起了用于服务的第二个绑定(bind),它没有被注入(inject)(所以我不明白所需要的绑定(bind))。谁能解释这里发生了什么,如果这是正确的方法吗?

最佳答案

所以问题是 guice 不会搜索您的程序并找到所有 @Inject您在任何地方加载的任何类中的点。相反,需要给它一些路径来查找您希望它注入(inject)东西的对象。通常,这由您使用 Guice 的方式来处理,因为标准模式是:

val injector = Guice.createInjector(/* stuff */)
val main = injector.getInstance(classOf[Main])
main.mainMethod()

Guice 对 Main 的实例进行注入(inject)您要求它制作/获取,并递归地对所有事物执行注入(inject) @Inject编入 main .

在您的情况下,这些陈述之一也将起作用;我说“其中之一”,因为虽然我可以确切地告诉你如何注入(inject) java,但我并不完全清楚 scala 编译器如何将 scala 伴随对象编译成 java 类。 (也就是说,我不知道 message 是否最终在 java 级别成为名为 MessageService$ 的类上的静态变量或实例变量, MessageService$ 通过某些线程安全的单例模式仅实例化一次)
requestInjection(MessageService)
requestStaticInjection(MessageService.type)

原因 toInstance有效的语句是 Guice 自动对传递给 toInstance 的所有对象执行注入(inject)。随着注入(inject)器的创建。 (绑定(bind)的东西 .asEagerSingleton 也将在注入(inject)器即将启动时对其执行注入(inject),如果您创建“生产模式”注入(inject)器,所有东西都将绑定(bind)为单例)

关于scala - 使用 Scala Guice 将特征绑定(bind)到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20575631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com