我正在使用Play with Scala,我正在尝试创建一个单例,我想从它的特性而不是直接注入它。
例如:
@ImplementedBy(classOf[S3RepositoryImpl])
trait S3Repository {
}
@Singleton
class S3RepositoryImpl extends S3Repository {
}
但这失败了,错误:
特质单身是抽象的;无法实例化
我尝试了几种组合,它们都产生了相同的效果。
我来自春天的背景,它很自然吗?我错过了Guice如何处理这种类型的注射剂吗?
感谢。
答案 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导入