4

我正在嘗試學習播放框架。我想在我的應用程序中實現播放框架的生命週期回調。現在我看到,它可以使用GlobalSettings下面很容易做到:如何實現播放框架的生命週期回調(2.5.x)

object Global extends GlobalSettings { 

    override def onStart(app: Application) { 
    Logger.info("Application has started") 
    } 

    override def onStop(app: Application) { 
    Logger.info("Application shutdown...") 
    } 

} 

但它在發揮框架(2.5.X)被棄用。並且他們提供了對onStart回調的熱切綁定,對於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時,很容易實現生命週期回調。假設我只是在生命週期回調中實現一個Logger信息。沒有複雜的代碼。
我如何實現這個啓動,停止和錯誤回調2.5.x

回答

4

一般而言,將這些機制從GlobalSettings中移除也意味着您不再在全局範圍內註冊這些「回調」,而是將它們與組件/類綁定。這提供了一個好處,即某個組件的初始化和關閉可能直接發生在相應的類中。但是,如果你想要在啓動(或關閉)時運行的代碼與特定組件無關(例如,日誌記錄,啓動檢查等),則必須爲它們創建新類並將它們綁定到你的模塊中。

請注意,在後一種情況下,您通常將相應的類作爲急切的單例(以確保它們已實例化),而在前一種情況下,類會作爲依賴關係樹的一部分實例化。

啓動:在由依賴注入容器管理的任何類的構造函數中運行代碼。在模塊

  1. 綁定類
bind(classOf[Hello]).to(classOf[EnglishHello]).asEagerSingleton 
在構造
  • 穿戴代碼
  • class EnglishHello extends Hello { 
        println("hello") 
    } 
    

    注意,asEagerSingleton不需要本身。正如我假設你使用指南,作爲DI-提供商,你可以閱讀更多有關在這裏:https://github.com/google/guice/wiki/Scopes

    關機:在需要運行一些關閉代碼任何類,註冊一個生命週期回調。在模塊 1.綁定類

    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

    +0

    我不理解此行綁定(classOf [Hello])。(classOf [EnglishHello])。asEagerSingleton。你可以詳細解釋它,例如什麼是Hello類,爲什麼要使用(classOf [EnglishHello])以及在這裏寫什麼是通過寫這行?我是這個框架的新手。你能以更簡單的方式解釋它嗎? –

    +0

    它意味着每當你請求一個'Hello'實例時(例如'class Bye @Inject()(h:Hello){..}'),'EnglishHello'的一個實例將被注入(傳入)。瞭解更多關於依賴注入如何有益於Guice創建者的這次演講:https://www.youtube.com/watch?v = 0iSB0L9avmg – rethab

    +0

    如何測試採用ApplicationLifecycle參數的類? – Blankman

    相關問題