Play Framework 2.4 全局对象迁移

Posted

技术标签:

【中文标题】Play Framework 2.4 全局对象迁移【英文标题】:Play Framework 2.4 Global object migration 【发布时间】:2016-04-14 05:43:20 【问题描述】:

我目前正在将我的 Play Framework 项目从 2.3 迁移到 2.4。现在我需要迁移我的全局对象。以下是他们迁移指南中的记录:

GlobalSettings.beforeStart 和 GlobalSettings.onStart:启动时需要发生的任何事情现在都应该在依赖注入类的构造函数中发生。一个类将在依赖注入框架加载它时执行它的初始化。如果您需要预先初始化(因为您需要在应用程序实际启动之前执行一些代码),请定义一个预先绑定。

首先,我需要迁移我的 Global.onStart 代码。除其他外,它使用 akka 订阅各种事件。以下是它通常的样子:

import play.api.Play.current

class ApplicationGlobal @Inject()(@Named("event-handler") eventHandlerActor: ActorRef) 

  system.eventStream.subscribe(eventHandlerActor, classOf[SomeEvent])


请注意 import 语句。 subscribe 方法需要它。由于这个简单的事实,我无法为这个 ApplicationGlobal 类定义一个急切的绑定,正如迁移文档中所建议的那样,因为该应用程序还不存在。因此,我有几个问题:

    据我了解,定义一个急切绑定实际上意味着定义一个类似于 beforeStart 方法的方法,因为代码在应用程序启动之前执行。对吗?

    如果正确,那么 onStart 方法的类比是什么?根据文档,此代码现在应该发生在依赖注入类的构造函数中。但是我应该在哪里注入这个 ApplicationGlobal 类?进入控制器类?但我喜欢其中的 10 个用于不同的功能。我应该将其注入所有这些吗?

【问题讨论】:

【参考方案1】:

我认为你必须这样想:

我的初始化代码是否需要在(几乎)所有事情之前全局发生?或者,它是特定组件所需要的?

在启动时应该发生的事情应该进入一个热切绑定的单例。某个组件需要的东西,应该放到相应类的构造函数中。

他们每个人都有各自的后果:

全局初始化:常规绑定只会在需要实例时创建实现的实例,并且每次将它们注入某处时都会创建一个新实例。然而,渴望单例在创建绑定时(或稍后)被实例化,无论是否有任何依赖于它们。此外,将只有一个实例。这就是你想要的全局初始化代码:在任何情况下都运行并且只运行一次。所以回答你的第二个问题:不,你不需要在任何地方注入它。 可以在相应类的构造函数中调用仅角蛋白组件所需的任何其他内容。不过,您需要了解该课程的范围。如果您的代码应该只运行一次(例如 addLifecycleHook),则该类必须是单例,否则每次创建该类的新实例时都会注册该挂钩。

因此,基本上 guice 将创建整个应用程序的依赖关系图,然后拉入第一个线程。其他一切都由此而来。如果您的某些代码需要Application 的实例,您也可以注入它。

【讨论】:

以上是关于Play Framework 2.4 全局对象迁移的主要内容,如果未能解决你的问题,请参考以下文章

迁移到 2.4.x (Java) 后在 Play Framework 中运行测试时出错

Play Framework 2.4 - 依赖注入替换 GlobalSettings.onStart()

Play Framework 2.4 在 Scala 模板中使用注入变量

Play Framework 2.4 发送邮件

Play Framework 2.4 授权

在 Play Framework 2.4 中为 Scala 实现 CORS