Scala 中的@Inject 是如何工作的

How does @Inject in Scala work

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

我试过了:

@Inject val mailer: MailerClient = null

但这似乎不起作用。是否有任何可能性将 @Inject 事物(即 mailerClient、WS 等)直接注入一个值,而不是控制器 class?

看起来很接近。将val改为var,因为不是final,需要后期注入

@Inject var mailer: MailerClient = null

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

@Inject var ws: WSClient = null

特别是我知道这个特别有效。

更新

创建了一个 demo on 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))
  }

}