2012-04-13 2 views
12

Guice의 나의 이해는 점이다Guice : 필드 주입의 영향

  • 생성자 수준 주입 (@Inject public class Widget(Dep one, Dep two)) 가 Guice는 항상이 Injector를 통해 호출 될 때마다 그 생성자를 주입합니다 의미한다; 및
  • 방법 수준 주입 (@Inject public void setDepOne(Dep one)) 은 Guice는 항상 너무 오래 Widget 객체가 Guice Injector

을 사용하여 만든이 두 가정이 올바른지,이 호출 될 때마다 그 방법을 주입합니다는 의미? 그렇지 않다면 명확히하십시오!

그럼 내가 신경 써야 할 부분은 다음과 같습니다. 필드 레벨 주입의 의미는 무엇입니까? 이 객체가 Guice 인젝터를 통해 생성 될 때 Guice는 항상 속성을 주입하는 것을 의미합니까

@Inject private Dep one; 

? 이 경우 생성자 수준의 주입과 충돌한다고 생각합니다. 예를 들어

,는 다음을 일으킬 충돌/오류 : 사전에

public class Widget { 
    @Inject private Dep one; 

    private Dep two; 

    // Dep one already injected as a field! 
    @Inject public Widget(Dep one, Dep two) { 
     // ... 
    } 
} 

감사합니다!

답변

0

가정은 정확합니다. 이 특별한 경우 Guice는 같은 필드에 갈 것이라는 것을 알 수 없기 때문에 Guice가 one 번을 한 번만 생성자를 통해 한 번 필드를 통해 두 번 주입 할 것이라고 믿습니다.

19

Guice는 항상 모든 필드, 메서드 및 @Inject으로 주석 된 단일 생성자를 삽입합니다. 생성자가 항상 먼저 삽입되므로 주석 필드는 실제로 해당 삽입을 덮어 씁니다. 이 변형 예를 보자

[email protected] 
[email protected] 

분명히 두 개의 서로 다른 객체 : 실행하면이 이런 식으로 뭔가를 생성합니다

class Widget { 
    @Inject 
    private Dep one; 

    @Inject 
    public Widget(Dep one) { 
     this.one = one; 
     System.out.println(one); 
    } 

    public void printDependency() { 
     System.out.println(one); 
    } 
} 

class Dep {} 

public class MyMain { 
    public static void main(String[] args) { 
     Injector i = Guice.createInjector(); 
     i.getInstance(Widget.class).printDependency(); 

    } 
} 

. 첫 번째 줄은 생성자입니다. 두 번째는 필드 주입입니다.

Guice 코드 샘플을 작성할 때 자세한 내용을 제외하고는 종종 필드 주입에 대한 사용을 발견하지 못했습니다. 프로덕션 코드에서는 테스트하기가 어렵 기 때문에 현명하지 않습니다.

+0

Guice는 싱글 톤과 같은 다른 바인딩을 찾지 못하면 주입하는 모든 종속성의 새 인스턴스를 항상 만듭니다. – logan

+0

왜 테스트에 좋지 않은지 설명 할 수 있습니까? – suitianshi

+0

이 경우 주입 된 필드는 비공개이므로 리플렉션과 같은 것을 사용하지 않으면 액세스하기가 어렵습니다. –