4

재생 프레임 워크를 배우려고합니다. 내 응용 프로그램에서 재생 프레임 워크의 수명주기 콜백을 구현하고 싶습니다.재생 프레임 워크 (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의)에서 사용되지 것 : 지금은 쉽게 GlobalSettings 아래을 사용하여 수행 할 수 있다고 보았다. 그리고 그들은 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를 사용하면 라이프 사이클 콜백을 구현하기가 쉽습니다. 라이프 사이클 콜백에 로거 정보를 구현한다고 가정합니다. 복잡한 코드가 없습니다.
시작, 중지 및 오류 콜백에 대해 어떻게 구현할 수 있습니까? 2.5.x ??

답변

4

일반적으로 이러한 메커니즘을 GlobalSettings에서 멀리 이동 시키면 더 이상 이러한 '콜백'을 전역 적으로 등록하지 않지만 구성 요소/클래스에 연결합니다. 이렇게하면 특정 구성 요소의 초기화 및 종료가 해당 클래스 내에서 직접 발생할 수있는 이점이 있습니다. 그러나 시작 (또는 종료)시 특정 구성 요소 (예 : 로깅, 시작 검사 등)에 연결되지 않은 코드를 사용하려면 해당 클래스에 대한 새 클래스를 만들어 모듈에 바인딩해야합니다.

후자의 경우 일반적으로 개별 클래스를 eager singleton으로 바인딩합니다 (인스턴스화되었는지 확인). 전자의 경우 클래스는 종속성 트리의 일부로 인스턴스화됩니다.

시작 : 종속성 주입 컨테이너에서 관리하는 모든 클래스의 생성자에서 코드를 실행합니다. 모듈

  1. 바인딩 클래스
bind(classOf[Hello]).to(classOf[EnglishHello]).asEagerSingleton 
생성자에서 asEagerSingleton이 자체 필요하지 않다는
class EnglishHello extends Hello { 
    println("hello") 
} 

참고

  • 넣어 코드
      을 . 난 당신이 DI-공급자로 가이드를 사용하고 있으리라 믿고있어, 당신은 여기에 대한 자세한 내용을보실 수 있습니다 https://github.com/google/guice/wiki/Scopes

      종료을 : 일부 종료 코드를 실행하는 데 필요한 모든 클래스에서, 라이프 사이클 콜백을 등록합니다. 모듈 1. 바인딩 클래스

      bind(classOf[Hello]).to(classOf[EnglishHello]).asEagerSingleton 
      
      1. 등록 라이프 사이클 콜백을 (그리고 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])를 사용하는지, 그리고이 라인을 작성하여 여기서 무엇을하고있는지를 자세히 설명 할 수 있습니까? 나는이 프레임 워크에 익숙하지 않다. u는 더 쉬운 방법 plz에서 그것을 설명 할 수 있습니까 ?? –

    +0

    'Hello'인스턴스를 요청할 때마다 (예 : class Bye @Inject() (h : Hello) {..}') 'EnglishHello'의 인스턴스가 삽입 (전달)됩니다. 의존성 주입이 guice의 생성자로부터이 대화에서 유익 할 수있는 방법에 대해 자세히 알아보십시오. https://www.youtube.com/watch?v=0iSB0L9avmg – rethab

    +0

    ApplicationLifecycle 매개 변수를 사용하는 단위 테스트 클래스는 어떻게 할 수 있습니까? – Blankman