PlayFramework 2.4在应用程序启动后运行一些代码

PlayFramework 2.4在应用程序启动后运行一些代码,playframework,playframework-2.4,Playframework,Playframework 2.4,在play 2.4中,重写ApplicationLoader中的builder方法或在抽象模块中实现绑定将替换现有的play 2.3 GlobalSettings onStart 然而,在play 2.3 onStart方法中,应用程序已经在加载所有插件/依赖项的情况下启动。在play 2.4中也可以这样做,即在应用程序启动后运行一段代码 在我的情况下,Slick要求应用程序在能够访问数据库之前已经启动 谢谢,罗伊,我不太明白你的问题 您对使用您提到的绑定有意见吗 如果您愿意,您仍然可以在Sta

在play 2.4中,重写ApplicationLoader中的builder方法或在抽象模块中实现绑定将替换现有的play 2.3 GlobalSettings onStart

然而,在play 2.3 onStart方法中,应用程序已经在加载所有插件/依赖项的情况下启动。在play 2.4中也可以这样做,即在应用程序启动后运行一段代码

在我的情况下,Slick要求应用程序在能够访问数据库之前已经启动


谢谢,罗伊,我不太明白你的问题

您对使用您提到的绑定有意见吗


如果您愿意,您仍然可以在Start、beforeStart等上使用GlobalSettings,这只是因为您希望离开全局状态而被劝阻。

众所周知,当您急切地在
模块中绑定一个类时,它会尝试尽快初始化它的一个实例。在PlayFramework2.4中,这是在应用程序启动之前获取运行代码的方式

但以下是DI的常见预期规则: 如果在要运行的类的构造函数中,您将作为参数(也称为“依赖项”)添加到
app:Application
中,那么它将在应用程序启动后执行;像这样:

import play.api.Application
import javax.inject.Inject

class MyInitCodeClass @Inject() (val app: Application) {

//YOUR CODE HERE

}
这是合乎逻辑的,因为任何称职的DI框架都会计算出他可以按什么顺序注入哪些类

然后,在您的模块中只需添加常规绑定(这里是playframework样式,而不是Guice):

希望这能奏效。停止使用Play.current
也很有用,只需使用Play 2.4的新DI系统注入应用程序即可


我想感谢@easel对我的帮助。

您好,谢谢您的回复。是的,您仍然可以在Start上使用GlobalSettings,但由于它已被弃用,将来将被删除,因此我不希望继续使用它。我面临的问题是,slick需要一个正在运行的应用程序才能查询数据库(即必须调用Play.start(app))。使用绑定,我可以在应用程序启动之前执行任务,但不能在应用程序启动之后执行。谢谢你的回答,它看起来很好,但我到现在还没有时间尝试。我可以将应用程序绑定到它,但在代码运行之前,应用程序的状态仍然没有启动。我自己也尝试过用“Play.start(app)”来启动它,但这并不理想,而且在生产中也造成了一些问题。这个解决方案在Play 2.6.19和Java中对我很有效,尽管我必须小心不要形成依赖循环。
bind[MyInitCodeClass] toSelf eagerly()