7.3. 모호하거나 불만족스러운 종속성


모호한 종속성은 컨테이너가 정확히 하나의 빈에 주입을 확인할 수 없는 경우 존재합니다.

컨테이너에서 빈에 대한 주입을 확인할 수 없는 경우 불만족한 종속성이 있습니다.

컨테이너는 종속성을 해결하기 위해 다음 단계를 수행합니다.

  1. 주입 지점의 빈 유형을 구현하는 모든 빈의 한정자 주석을 확인합니다.
  2. 비활성화된 빈을 필터링합니다. 비활성화된 빈은 명시적으로 활성화되지 않은 @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;

7.3.2. 한정자를 사용하여 모호한 주입 해결

한정자를 사용하여 모호한 주입을 해결할 수 있습니다. 모호한 또는 불만족스러운 종속성에서 모호한 주입에 대해 자세히 알아보십시오.

다음 예제는 모호한 예이며 두 개의 Welcome 구현이 있습니다. 하나는 변환되고 그렇지 않은 것입니다. Welcome(환영)을 사용하려면 삽입을 지정해야 합니다.

예제: 모호한 주입

public class Greeter {
  private Welcome welcome;

  @Inject
  void init(Welcome welcome) {
    this.welcome = welcome;
  }
  ...
}

한정자를 사용하여 모호한 주입 해결
  1. 모호한 주입을 해결하려면 @Translating:

    @Qualifier
    @Retention(RUNTIME)
    @Target({TYPE,METHOD,FIELD,PARAMETERS})
    public @interface Translating{}
  2. @Translating 주석을 사용하여 Translation Welcome 에 주석을 답니다.

    @Translating
    public class TranslatingWelcome extends Welcome {
        @Inject Translator translator;
        public String buildPhrase(String city) {
            return translator.translate("Welcome to " + city + "!");
        }
        ...
    }
  3. 삽입에 환영을 요청하십시오. 팩토리 방법 패턴과 유사하게 정규화된 구현을 명시적으로 요청해야 합니다. 주입 지점에서 모호성이 해결됩니다.

    public class Greeter {
      private Welcome welcome;
      @Inject
      void init(@Translating Welcome welcome) {
        this.welcome = welcome;
      }
      public void welcomeVisitors() {
        System.out.println(welcome.buildPhrase("San Francisco"));
      }
    }
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2026 Red Hat
맨 위로 이동