来自特质的Guice和Play2 Singleton

时间:2016-02-17 12:50:17

标签: scala playframework playframework-2.0 guice

我正在使用Play with Scala,我正在尝试创建一个单例,我想从它的特性而不是直接注入它。

例如:

@ImplementedBy(classOf[S3RepositoryImpl])
trait S3Repository {
}
@Singleton
class S3RepositoryImpl extends S3Repository {
}

但这失败了,错误:

  

特质单身是抽象的;无法实例化

我尝试了几种组合,它们都产生了相同的效果。

我来自春天的背景,它很自然吗?我错过了Guice如何处理这种类型的注射剂吗?

感谢。

4 个答案:

答案 0 :(得分:28)

正如@ Tavian-Barnes所指出的,解决方案是确保您拥有以下导入:

import javax.inject.Singleton

答案 1 :(得分:6)

我在这里有一个“完整的”工作实例,只是希望我没有陈述明显的......

package controllers

import play.api._
import play.api.mvc._
import com.google.inject._

class Application @Inject() (s3: S3Repository) extends Controller {
  def index = Action {
    println(s3.get)
    Ok
  }
}

@ImplementedBy(classOf[S3RepositoryImpl])
trait S3Repository {
  def get: String
}

@Singleton
class S3RepositoryImpl extends S3Repository {
  def get: String = "bla"
}

每当您使用@Inject标记类的构造函数时,Guice将管理实例本身的注入。因此,如果您将类标记为@Singleton,Guice将创建并始终只为您提供一个实例。没有人可以阻止您在代码中手动实例化类...您可以在Play详细探索它。

答案 2 :(得分:2)

在下方使用导入,而不是import javax.inject.Singleton

import com.google.inject.{Inject, Singleton}

答案 3 :(得分:0)

同时导入Inject和Singleton。

import javax.inject.{Inject, Singleton}

避免使用:

import com.google.inject.{Inject, Singleton}

播放框架需要javax导入