定义Scala控制器时,将类标记为单例使用@Singleton注释:
@Singleton
class Application
https://docs.oracle.com/javaee/7/api/javax/inject/Singleton.html将singleton定义为'标识注入器仅实例化一次的类型。没有继承。“那么依赖Java依赖注入的Scala播放依赖注入框架是什么?
From https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection'Play支持基于JSR 330的运行时依赖注入(在本页中描述)和Scala中的编译时依赖注入。使用@Singleton利用'基于JSR 330的依赖注入',以便在Scala中使用'编译时依赖注入'需要什么?
答案 0 :(得分:2)
是依赖Java的Scala play依赖注入框架 依赖注入?
是的,所以你需要写import javax.inject._
你使用DI的每个文件。
你需要做的基本上是
·将界面定义为trait
trait FooService {
def getBar(baz: String):Future[Bar]
}
·实施界面
class FooServiceImpl extends FooService {
def getBar(baz: String) = ???
}
·通过Module.scala(guice风格)绑定它们
class Module extends AbstractModule {
override def configure() = {
bind(classOf[FooService]).to(classOf[FooServiceImpl])
}
}
·使用它
class FooController @Inject()(fooService: FooService)(implicit exec: ExecutionContext) extends Controller {
def index = Action.async = {
fooService.getBar("fooBar").map{_.doWhatEverYouWant}
.....
}
}
正如您所看到的,当您使用这种DI方式时,您需要定义类参数。这就是您不能使用Scala object
并使用@Singleton
的原因。
答案 1 :(得分:0)
编译时和运行时DI之间的主要区别在于,对于运行时DI,在运行应用程序之前,您将无法知道您的依赖项是否已连线并完成(即,您将收到运行时错误而不是编译时错误)
有关播放编译时DI支持的更多信息,我强烈建议您查看有关它的official documentation。