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