scala – 如何实现play框架的生命周期回调(2.5.x)
我正在努力学习游戏框架.我想在我的应用程序中实现play框架的生命周期回调.现在我看到可以使用下面的GlobalSettings轻松完成:
object Global extends GlobalSettings { override def onStart(app: Application) { Logger.info("Application has started") } override def onStop(app: Application) { Logger.info("Application shutdown...") } } 但它已在play框架(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.基本思想是你实现一个包含许多方法的类,这些方法将由Play调用!关于各自的错误.这在此记录:https://www.playframework.com/documentation/2.5.x/ScalaErrorHandling (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |