如何在 Play 中不需要控制器请求的情况下初始化急切的单例?

How do I initialize an eager singleton without requiring a controller request in Play?

在基于 Scala 的 Play 应用程序中,我试图在不需要向控制器发出请求的情况下启动单例服务。我已按照 2.4 API documentation 中的说明创建单例 class,然后使用 Guice 的依赖注入库将 class 绑定为 eager单例。

即使使用急切绑定,在我通过控制器路由收到请求之前,单例仍然不会被调用。关于我做错了什么有什么想法吗?

模块

package models

import com.google.inject.AbstractModule
import com.google.inject.name.Names

class MessageLogModule extends AbstractModule {
  def configure() = {
    bind(classOf[MessageLogService]).asEagerSingleton
  }
}

配置

play.modules.enabled += "models.MessageLogModule"

单例

package models

import javax.inject._

@Singleton
class MessageLogService {
  // Create a file to test
  println("IN SINGLETON - CREATING NEW FILE")
  val file = new java.io.File("howdy.txt")
  file.createNewFile
}

运行 命令

sbt compile run

上面的单例在我发出...之前不会被调用...

curl http://localhost:9000/

我想要的是 MessageLogService 在 运行 服务点启动,而不是等待请求到达控制器路由。

你想要的是:sbt compile start

run 将编译和初始化延迟到第一次请求以允许更快的更改-刷新-查看更改开发周期。