2016-11-02 2 views
2

모두JSR-330의 Inject와 Provider의 차이점

JSR-330의 Inject와 Provider의 차이점은 무엇입니까? 나는 google guice를 사용하고 있으며 매일 @Inject을 사용하고 있으며 JSR-330에서 알고있는 것은 Provider<T>입니다.

내 질문

  1. Provider<T>의 의미는 무엇입니까?
  2. 언제 사용자 Provider<T>?
  3. @Inject과의 차이점은 무엇입니까?

미리 감사드립니다.

답변

5

모든 이미 javadoc에 설명, 내가 인용 :

을 직접 (암시 적으로 만 @Inject 사용) T 주입에 비해 Provider<T> 주입이 가능 :

  1. 여러 인스턴스를 검색 .
  2. 인스턴스를 지연 또는 선택적으로 검색합니다.
  3. 중단 순환 종속성.
  4. 범위를 추상화하여 포함 된 범위의 인스턴스에서 더 작은 범위의 인스턴스를 찾을 수 있습니다. # 1

예 :이 공장으로 사용되도록 여기

동일한 공급자로부터 Seat의 여러 인스턴스를 얻을. # 2

class Car { 
    @Inject 
    Car(Provider<Seat> seatProvider) { 
     Seat driver = seatProvider.get(); 
     Seat passenger = seatProvider.get(); 
     ... 
    } 
} 

예 : 여기

당신은 우리가 느린 작업입니다 것을 알고 직접 클래스 MyClassLongToCreate의 인스턴스를 생성 방지하기 위해 공급자를 사용, 그래서 우리는 유유히 감사를 얻을 것이다 필요시에만 get 방법으로 전송할 수 있습니다. # 3

class MyClass { 
    @Inject 
    private Provider<MyClassLongToCreate> lazy; 
    ... 
} 

예 : 여기

들은 그것을 해결하는 방법을 모르는 일부 컨테이너 단지 예외를 던질 수 있도록 용기에 의해 쉽게 해결 될 수없는 순환 종속성 인 그들 자신이.이 컨테이너가 완전히 처음 C1의 인스턴스를 만들 수

class C1 { 
    private final Provider<C2> c2; 
    @Inject 
    C1(Provider<C2> c2) { 
     this.c2 = c2; 
     ... 
    } 
} 

(:

class C1 { 
    private final C2 c2; 
    @Inject 
    C1(C2 c2) { 
     this.c2 = c2; 
     ... 
    } 
} 

class C2 { 
    private final C1 c1; 
    @Inject 
    C2(C1 c1) { 
     this.c1 = c1; 
     ... 
    } 
} 

은 우리가 옆에 순환 종속성을 깰 생성자 중 적어도 하나에 Provider을 사용하여 그것을 해결하기 위해 C2의 인스턴스를 만들어 C2 제공자에게 주입해야 할 필요가 없으므로 컨테이너가 C1 인스턴스에서 C2의 인스턴스를 생성 할 수있게됩니다.

예 # 4 : 여기

당신은 itslef가 요청에 범위 것을 C1에 따라 세션에 범위가 클래스 C2, 우리는 우리의 인스턴스를 얻을 수 있도록하기 위해 공급자를 사용하여이 C1은 현재 요청에 해당하므로 한 요청에서 다른 요청으로 변경됩니다.

@RequestScoped 
public class C1 { 
    ... 
} 

@SessionScoped 
public class C2 { 
    @Inject 
    private Provider<C1> provider; 
    ... 
    public void doSomething() { 
     // Get the instance corresponding to the current request 
     C1 c1 = provider.get(); 
     ... 
    } 
} 
+1

예는 니콜라 – diligent

+0

# 2, 덕분에 매우 명확하다 - 실제로 필요로하는 대신 초기 주입 시간에 때 객체가 생성 될 주입을 위해 느린 유일한 이유는 아니다, 당신은 또한해야하는 경우가있을 수 있습니다. –

+0

@ ThorbjørnRavnAndersen # 2로 "Example # 2"를 의미하는 경우 아이디어를 더 많이 보여주기위한 예일뿐입니다. 당신이 설명한 것은 이미 내 대답에 언급되어있다. "선택적인 검색" –

관련 문제