gpt4 book ai didi

scala - 如何实现play框架(2.5.x)的生命周期回调

转载 作者:行者123 更新时间:2023-12-01 22:37:41 25 4
gpt4 key购买 nike

我正在尝试学习play框架。我想在我的应用程序中实现 Play Framework 的生命周期回调。现在我发现可以使用下面的 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 Framework (2.5.x)中被弃用。他们为 onStart 回调提供急切绑定(bind),对于 onStoponError 还有其他机制。我查看了 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 时,实现生命周期回调非常容易。假设我将在生命周期回调中实现记录器信息。没有复杂的代码。
我如何在2.5.x中实现启动、停止和错误回调??

最佳答案

一般来说,将这些机制从 GlobalSettings 中移开也意味着您不再全局注册此类“回调”,而是将它们绑定(bind)到组件/类。这带来的好处是某个组件的初始化和关闭可以直接在相应的类内部发生。但是,如果您想要在启动(或关闭)时运行的代码不与特定组件(例如日志记录、启动检查等)绑定(bind),您将必须为它们创建新类并将它们绑定(bind)到您的模块中。

请注意,在后一种情况下,您通常将相应的类绑定(bind)为急切的单例(以确保它们被实例化),而在前一种情况下,这些类被实例化为依赖关系树的一部分。

启动:在依赖注入(inject)容器管理的任何类的构造函数中运行代码。

  1. 在模块中绑定(bind)类

    bind(classOf[Hello]).to(classOf[EnglishHello]).asEagerSingleton
  2. 将代码放入构造函数

    class EnglishHello extends Hello {
    println("hello")
    }

请注意,asEagerSingleton 本身并不是必需的。我假设您使用 Guice 作为 DI 提供商,您可以在此处阅读更多相关信息:https://github.com/google/guice/wiki/Scopes

关闭:在任何需要运行关闭代码的类中,注册一个生命周期回调。

  1. 在模块中绑定(bind)类

    bind(classOf[Hello]).to(classOf[EnglishHello]).asEagerSingleton
  2. 注册生命周期回调(并注入(inject) ApplicationLifecycle)

    class EnglishHello @Inject() (lifecycle: ApplicationLifecycle) extends Hello {
    lifecycle.addStopHook { () =>
    Future.successful(connection.stop())
    }
    }

请注意,您可能希望将这些类的范围限制为单例,否则您最终会为每个实例注册停止 Hook - 根据您的停止 Hook 的作用,这可能就是您想要的。在这里阅读更多相关信息:https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Stopping/cleaning-up

错误:实现您自己的HttpErrorHandler。基本思想是您实现一个具有许多将由 Play! 调用的方法的类。关于各自的错误。这记录在此处:https://www.playframework.com/documentation/2.5.x/ScalaErrorHandling

关于scala - 如何实现play框架(2.5.x)的生命周期回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37558782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com