2012-02-20 5 views
3

변수에 대한 주입을 사용하여 약간 손실되었습니다. 내가 수업에 필요한 곳마다 내 RPC 서비스를 호출 할 수 있습니다이 코드GIN @ Rpc 서비스 용 @Inject on

private XXServiceAsync xxServiceAsync; 

@Inject 
protected IndexViewImpl(EventBus eventBus, XXServiceAsync tableManagementServiceAsync) { 
    super(eventBus, mapper); 

    this.xxServiceAsync = xxServiceAsync; 
    initializeWidgets(); 
} 

(클릭에 ...) 나는 약간에게 코드를 삭제하고 싶습니다 :이 코드 작업을 얻었다

변수에 직접 주입함으로써; 그럴 경우 :

@Inject 
private XXServiceAsync xxServiceAsync; 


protected IndexViewImpl(EventBus eventBus) { 
    super(eventBus, mapper); 
    initializeWidgets(); 
} 

이렇게하면 서비스가 항상 NULL로 유지됩니다. 내가 잘못하고 있니? 그렇지 않으면 rpc 서비스가있는 GIN 마술은 의미가 있습니까?

감사합니다.

답변

5

Gin (및 Guice와 같은 다른 프레임 워크)이 생성자가 실행을 완료 할 때까지 필드를 할당 할 수 없으므로이 시점에서 여전히 null입니다.

은 수동으로 코드 (즉, 진/Guice이 보이지 않는 메소드를 호출, 개인 필드를 할당하는 약간의 속임수 것 기억)을 배선 한 경우이 어떻게 보일지 생각해

MyObject obj = new MyObject();//initializeWidgets() runs, too early! 
obj.xxServiceAsync = GWT.create(xxService.class); 

당신이 뭔가를해야하는 경우 생성자를 생성자에 전달합니다. asWidget()이 호출 될 때까지 즉시 필요 없다면 @Inject로 주석을 달아 놓은 필드 나 세터가 도움이 될 수 있습니다.

+0

일단 생성자가 실행을 마쳤 으면 필드가 지정된다는 점을 지적 해 주셔서 감사합니다. –

0

필드 레벨 주입을 사용하는 경우 빈 @Inject 메소드를 사용하여 주입 후 초기화를 수행 할 수 있습니다. no-arg 주입 메소드는 클래스의 필드 주입이 완료된 후에 실행됩니다.

@Inject void initialize(){ 
    ... 
    initializeWidgets() 
} 

편집 : 이전에 메소드 삽입 후에도 실행되었다고 이전에 언급했으나 테스트 결과 항상 그런 것은 아니라고합니다.

+0

클래스에 대해 실행될 주사 목록을 실제로 생성하는 코드에 대해 InjectionPoint.getInjectionPoints를 참조하십시오. 그것은 유형 계층 구조를 주입하는 필드와 각 수퍼 클래스의 메소드를 따라갈 것입니다. 즉, 클래스에 Inject 메서드가있는 경우 클래스의 모든 Inject 필드 다음에 실행됩니다. 그러나이 행동에 의존하는 것은 나쁜 습관입니다. (이것은 Guice 코드에 있지만 Gin 생성 코드는 비슷할 가능성이 큽니다) – idle