在Scala播放框架中使用@Singleton

时间:2016-05-22 21:19:37

标签: scala dependency-injection playframework-2.0

定义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中使用'编译时依赖注入'需要什么?

2 个答案:

答案 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