7.3. 모호하거나 불만족스러운 종속성
모호한 종속성은 컨테이너가 정확히 하나의 빈에 주입을 확인할 수 없는 경우 존재합니다.
컨테이너에서 빈에 대한 주입을 확인할 수 없는 경우 불만족한 종속성이 있습니다.
컨테이너는 종속성을 해결하기 위해 다음 단계를 수행합니다.
- 주입 지점의 빈 유형을 구현하는 모든 빈의 한정자 주석을 확인합니다.
-
비활성화된 빈을 필터링합니다. 비활성화된 빈은 명시적으로 활성화되지 않은
@Alternative빈입니다.
모호한 종속성 또는 불만족스러운 종속성이 있는 경우 컨테이너는 배포를 중단하고 예외가 발생합니다.
모호한 종속성을 수정하려면 Qualifier를 사용하여 모호한 주입 해결을 참조하십시오.
7.3.1. 한정자
한정자는 컨테이너가 주입 지점에 맞는 여러 빈을 확인할 수 있는 경우 모호한 종속성을 방지하는 데 사용되는 주석입니다. 주입 지점에 선언된 한정자는 동일한 한정자를 선언하는 적격 빈 세트를 제공합니다.
한정자는 아래 예와 같이 보존 및 대상을 사용하여 선언해야 합니다.
예제: @Synchronous 및 @ Asynchronous 한정자를 정의합니다.
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Synchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Asynchronous {}예제: @Synchronous 및 @Asynchronous 한정자 사용
@Synchronous
public class SynchronousPaymentProcessor implements PaymentProcessor {
public void process(Payment payment) { ... }
}
@Asynchronous
public class AsynchronousPaymentProcessor implements PaymentProcessor {
public void process(Payment payment) { ... }
}'@Any'
빈 또는 주입 지점에서 한정자를 명시적으로 선언하지 않을 때마다 컨테이너에서 한정자 @Default 를 가정합니다. 한정자를 지정하지 않고 주입 지점을 선언해야 하는 경우도 있습니다. 이에 대한 한정자가 있습니다. 모든 빈에는 한정자 @Any 가 있습니다. 따라서 주입 지점에 @Any 를 명시적으로 지정하여 주입할 수 있는 빈을 제한하지 않고 기본 한정자를 억제합니다.
이 기능은 특정 빈 유형의 모든 빈을 반복하려는 경우 특히 유용합니다.
import javax.enterprise.inject.Instance;
...
@Inject
void initServices(@Any Instance<Service> services) {
for (Service service: services) {
service.init();
}
}
모든 빈에는 이 한정자를 명시적으로 선언하지 않더라도 한정자 @Any 가 있습니다.
또한 모든 이벤트에는 이 한정자를 명시적으로 선언하지 않고 제기된 한정자 @Any 가 있습니다.
@Inject @Any Event<User> anyUserEvent;
@Any 한정자를 사용하면 주입 지점에서 모든 빈 또는 특정 빈 유형의 모든 이벤트를 참조할 수 있습니다.
@Inject @Delegate @Any Logger logger;