Playframework Play Framework 2.4全局对象迁移

Playframework Play Framework 2.4全局对象迁移,playframework,playframework-2.4,Playframework,Playframework 2.4,我目前正在将Play Framework项目从2.3迁移到2.4。现在我需要迁移我的全局对象。以下是他们的迁移指南中的记录: GlobalSettings.beforeStart和GlobalSettings.onStart:启动时需要发生的任何事情现在都应该发生在依赖注入类的构造函数中。当依赖项注入框架加载类时,该类将执行其初始化。如果需要即时初始化(因为需要在应用程序实际启动之前执行某些代码),请定义即时绑定。 首先,我需要迁移Global.onStart代码。除此之外,它还使用akka订阅

我目前正在将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])

}
请注意导入语句。订阅方法需要它。由于这个简单的事实,我不能像migration doc中建议的那样为这个ApplicationGlobal类定义一个急切的绑定,因为这个应用程序还不存在。因此,我有几个问题:

  • 据我所知,定义渴望绑定实际上意味着定义一个类似于beforeStart方法的方法,因为代码在应用程序启动之前执行。对吗

  • 如果正确,那么onStart方法的模拟是什么?根据文档,这段代码现在应该发生在依赖注入类的构造函数中。但是我应该在哪里注入这个应用程序全局类呢?进入控制器类?但我有10个不同的功能。我应该把它全部注射进去吗


  • 我认为你必须这样考虑:

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

    启动时会发生一次的事情应该进入一个热切的单身状态。某个组件所需的东西将进入相应类的构造函数

    其中每一项都有各自的后果:

    • 全局初始化:常规绑定只会在需要实例时创建实现的实例,并在每次将它们注入某处时创建新实例。然而,无论是否有任何东西依赖于它们,都会在创建绑定时(或稍后)实例化渴望的单例。而且,只有一个实例。这就是全局初始化代码所需要的:在任何情况下运行,并且只运行一次。所以要回答你的第二个问题:不,你不需要在任何地方注射它
    • 仅ceratin组件需要的任何其他内容都可以在相应类的构造函数中调用。不过,您需要知道该类的范围。如果您有只应运行一次的代码(例如addLifecycleHook),则该类必须是单例,否则每次创建该类的新实例时都会注册挂钩
    因此,基本上guice将创建整个应用程序的依赖关系图,然后启动第一个线程。其他一切都是如此。如果您的一些代码需要
    应用程序
    的实例,您也可以将其注入