Play Framework 2.4全局对象迁移

时间:2016-04-14 05:43:21

标签: playframework playframework-2.4

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

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])

}

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

  1. 据我所知,定义急切绑定实际上意味着定义 beforeStart 方法的模拟,因为代码在应用程序启动之前执行。这是对的吗?

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

1 个答案:

答案 0 :(得分:0)

我认为你必须这样思考:

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

在启动时应该发生的事情应该进入一个热切紧张的单身人士。某个组件所需的东西应该进入相应类的构造函数。

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

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

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