我努力学习游戏框架。我想实现我的应用程序播放框架的生命周期回调。现在我看到,它可以使用下面GlobalSettings轻松完成:
object Global extends GlobalSettings {
override def onStart(app: Application) {
Logger.info("Application has started")
}
override def onStop(app: Application) {
Logger.info("Application shutdown...")
}
}
但它被废弃在剧中框架(2.5.X)。而他们所提供的渴望onStart
回调和onStop
结合和onError
还有其他机制。我看着版本2.5.X的文件,看到一个代码中有象下面这样:
import com.google.inject.AbstractModule
import com.google.inject.name.Names
class Module extends AbstractModule {
def configure() = {
bind(classOf[Hello])
.annotatedWith(Names.named("en"))
.to(classOf[EnglishHello]).asEagerSingleton
bind(classOf[Hello])
.annotatedWith(Names.named("de"))
.to(classOf[GermanHello]).asEagerSingleton
}
}
但不幸的是我无法理解。作为使用GlobalSettings,这是很容易的实现生命周期回调。假设我将只实现在生命周期回调一个Logger信息。没有复杂的代码。 我怎样才能实现这个为起点,在2.5.X停止和错误回调?
一般来说已经搬到这些机制从GlobalSettings
事情远也意味着,你不再注册这样的“回调”全球范围内,但你配合他们一个组件/类。这给出了一个特定组件的初始化和关闭可以在相应类中发生直接的利益。但是,如果你有,你要在启动时(或关闭)运行不依赖于特定的组件代码(如日志记录,启动检查等),你将不得不为他们创造新的类和你模块约束力。
请注意,在后一种情况下,你通常结合各自的班急于单身(以确保它们被实例化),而在前者的情况下,类被实例化的依赖关系树的一部分。
启动:在由依赖注入容器管理的任何类的构造函数中运行代码。
bind(classOf[Hello]).to(classOf[EnglishHello]).asEagerSingleton
class EnglishHello extends Hello {
println("hello")
}
需要注意的是asEagerSingleton
本身不只需要。正如我假设你使用的吉斯为DI-提供商,你可以阅读更多有关在这里:https://github.com/google/guice/wiki/Scopes
关机:在需要运行一些关闭代码任何类,注册一个生命周期回调。
bind(classOf[Hello]).to(classOf[EnglishHello]).asEagerSingleton
ApplicationLifecycle
)
class EnglishHello @Inject() (lifecycle: ApplicationLifecycle) extends Hello {
lifecycle.addStopHook { () =>
Future.successful(connection.stop())
}
}
请注意,您可能需要范围这些类为单身,否则你最终注册停止钩子每个实例 - 这取决于你的制动钩做什么,这可能是你想要的。了解更多关于这个在这里:https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Stopping/cleaning-up
错误:实现自己的HttpErrorHandler
。其基本思想是,你实现了一些方法,这些方法将被播放被称为类!在各自的错误。这是记录在这里:https://www.playframework.com/documentation/2.5.x/ScalaErrorHandling