如何在 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
将编译和初始化延迟到第一次请求以允许更快的更改-刷新-查看更改开发周期。
在基于 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
将编译和初始化延迟到第一次请求以允许更快的更改-刷新-查看更改开发周期。