Guice可以注入Scala对象

时间:2012-12-09 21:05:20

标签: scala guice

在Scala中,我可以使用Guice注入Scala object吗?

例如,我可以在s中注入以下对象吗?

object GuiceSpec {
  @Inject
  val s: String = null

  def get() = s
}

2 个答案:

答案 0 :(得分:19)

Google上的一些研究(参见this post)显示您可以按照以下方式完成此操作(后面的代码是ScalaTest单元测试):

import org.junit.runner.RunWith
import org.scalatest.WordSpec
import org.scalatest.matchers.MustMatchers
import org.scalatest.junit.JUnitRunner
import com.google.inject.Inject
import com.google.inject.Module
import com.google.inject.Binder
import com.google.inject.Guice
import uk.me.lings.scalaguice.ScalaModule

@RunWith(classOf[JUnitRunner])
class GuiceSpec extends WordSpec with MustMatchers {

  "Guice" must {
    "inject into Scala objects" in {
      val injector = Guice.createInjector(new ScalaModule() {
        def configure() {
          bind[String].toInstance("foo")
          bind[GuiceSpec.type].toInstance(GuiceSpec)
        }
      })
      injector.getInstance(classOf[String]) must equal("foo")
      GuiceSpec.get must equal("foo")
    }
  }
}

object GuiceSpec {
  @Inject
  val s: String = null

  def get() = s
}

这假设您使用的是scala-guiceScalaTest

答案 1 :(得分:1)

上述答案是正确的,但如果您不想使用ScalaGuice扩展程序,则可以执行以下操作:

val injector = Guice.createInjector(new ScalaModule() {
    def configure() {
      bind[String].toInstance("foo")
    }

    @Provides
    def guiceSpecProvider: GuiceSpec.type = GuiceSpec
  })