我想知道在Play-Scala中,@Inject注释是如何工作的。它显然是用来注入依赖的,但我很好奇它是如何工作的。 当我在扩展控制器类并将路由生成器设置为injectroutesgenerator时使用它,它似乎可以自动从这些类创建对象,但是我该如何在其他上下文中使用它呢?
我尝试过:
@Inject val mailer: MailerClient = null
但那似乎行不通。是否有可能直接将@Inject的内容(如mailerClient、WS等)注入到值中,而不是控制器类中?
我想知道在Play-Scala中,@Inject注释是如何工作的。它显然是用来注入依赖的,但我很好奇它是如何工作的。 当我在扩展控制器类并将路由生成器设置为injectroutesgenerator时使用它,它似乎可以自动从这些类创建对象,但是我该如何在其他上下文中使用它呢?
我尝试过:
@Inject val mailer: MailerClient = null
但那似乎行不通。是否有可能直接将@Inject的内容(如mailerClient、WS等)注入到值中,而不是控制器类中?
看起来很接近。将val
更改为var
,因为它不是最终值,并且需要在稍后的阶段注入。
@Inject var mailer: MailerClient = null
我还建议检查项目配置中是否将MailerClient
库作为依赖项列出。您可以尝试使用WSClient
,因为它已经包含在模板中:
@Inject var ws: WSClient = null
特别是我知道这个特定的内容是有效的。
在GitHub上创建了一个演示,其中包含Play-Scala
模板,并将index
方法更改如下:
此外,还请参考以下链接:https://github.com/bjfletcher/play-inject-field-example
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))
}
}