모두JSR-330의 Inject와 Provider의 차이점
JSR-330의 Inject와 Provider의 차이점은 무엇입니까? 나는 google guice를 사용하고 있으며 매일 @Inject
을 사용하고 있으며 JSR-330에서 알고있는 것은 Provider<T>
입니다.
내 질문
Provider<T>
의 의미는 무엇입니까?- 언제 사용자
Provider<T>
? @Inject
과의 차이점은 무엇입니까?
미리 감사드립니다.
모두JSR-330의 Inject와 Provider의 차이점
JSR-330의 Inject와 Provider의 차이점은 무엇입니까? 나는 google guice를 사용하고 있으며 매일 @Inject
을 사용하고 있으며 JSR-330에서 알고있는 것은 Provider<T>
입니다.
내 질문
Provider<T>
의 의미는 무엇입니까?Provider<T>
?@Inject
과의 차이점은 무엇입니까?미리 감사드립니다.
모든 이미 javadoc에 설명, 내가 인용 :
을 직접이 (암시 적으로 만
@Inject
사용)T
주입에 비해Provider<T>
주입이 가능 :
- 여러 인스턴스를 검색 .
- 인스턴스를 지연 또는 선택적으로 검색합니다.
- 중단 순환 종속성.
- 범위를 추상화하여 포함 된 범위의 인스턴스에서 더 작은 범위의 인스턴스를 찾을 수 있습니다. # 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();
...
}
}
예는 니콜라 – diligent
# 2, 덕분에 매우 명확하다 - 실제로 필요로하는 대신 초기 주입 시간에 때 객체가 생성 될 주입을 위해 느린 유일한 이유는 아니다, 당신은 또한해야하는 경우가있을 수 있습니다. –
@ ThorbjørnRavnAndersen # 2로 "Example # 2"를 의미하는 경우 아이디어를 더 많이 보여주기위한 예일뿐입니다. 당신이 설명한 것은 이미 내 대답에 언급되어있다. "선택적인 검색" –