Scala中的@Inject是如何工作的

Hai*_*ito 10 dependency-injection scala playframework playframework-2.0

我想知道Play-Scala中的@Inject注释是如何工作的.它显然注入了依赖,但我很好奇它是如何工作的.当我在类扩展控制器上使用它并将路由生成器设置为injectroutesgenerator时,它似乎从这些类中自动创建对象,但是如何在其他上下文中使用它?

我试过了:

@Inject val mailer: MailerClient = null
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.@Inject的东西(mailerClient,WS ets.)是否有任何可能直接与值,而不是控制器类?

bjf*_*her 7

看起来很近.更改valvar,因为它不是最终的,需要在后期进行注射.

@Inject var mailer: MailerClient = null
Run Code Online (Sandbox Code Playgroud)

我还要检查MailerClient库是否被提及为项目配置中的依赖项.您可以尝试使用,WSClient因为它默认包含在模板中:

@Inject var ws: WSClient = null
Run Code Online (Sandbox Code Playgroud)

特别是我知道这个特别的作品.

更新

在GitHub上创建了一个演示,Play-Scala模板的index方法更改如下:

import play.api._
import play.api.libs.ws.WSClient
import play.api.mvc._
import play.api.libs.concurrent.Execution.Implicits.defaultContext

class Application extends Controller {

  @Inject var ws: WSClient = null

  def index = Action.async {
    ws.url("http://google.com").get.map(r => Ok(r.body))
  }

}
Run Code Online (Sandbox Code Playgroud)

  • 没关系,你需要告诉系统注射模块(@Singleton本身是不够的).看看这个Play 2.4的具体示例:http://stackoverflow.com/a/30959808/722180看看这个有更多Scala方法:http://stackoverflow.com/a/24823300/722180 (2认同)