복붙노트

[SPRING] 일치하는 bean이 두 개 이상 발견되면 Spring은 이름으로 어떻게 자동으로 연결합니까?

SPRING

일치하는 bean이 두 개 이상 발견되면 Spring은 이름으로 어떻게 자동으로 연결합니까?

다음과 같은 인터페이스가 있다고 가정합니다.

interface Country {}
class USA implements Country {}
class UK implements Country ()

그리고 구성 xml의 스 니펫 :

<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>

아래의 autowired 의존성을 어떻게 제어 할 수 있습니까? 나는 영국을 원합니다.

class Main {
    private Country country;
    @Autowired
    public void setCountry(Country country) {
        this.country = country;
    }
}

나는 3.0.3.RELEASE를 사용하고있다.

해결법

  1. ==============================

    1.이것은 Spring 3.0 매뉴얼의 3.9.3 절에 설명되어있다.

    이것은 Spring 3.0 매뉴얼의 3.9.3 절에 설명되어있다.

    즉, 기본 동작은 setter 메서드에 @Qualifier ( "country")를 추가 한 것과 같습니다.

  2. ==============================

    2.@Qualifier 주석을 사용할 수 있습니다.

    @Qualifier 주석을 사용할 수 있습니다.

    여기에서

    한정자를 사용하여 주석 기반 자동 와이어 링 미세 조정

    유형별 자동 와이어 링은 여러 후보로 이어질 수 있으므로 선택 프로세스를보다 잘 제어 할 필요가 있습니다. 이를 수행하는 한 가지 방법은 Spring의 @Qualifier 주석을 사용하는 것입니다. 이를 통해 한정자 값을 특정 인수와 연결하여 유형 일치 집합을 좁혀 각 인수에 대해 특정 bean을 선택하도록합니다. 가장 단순한 경우이 값은 일반적인 설명 값일 수 있습니다.

    class Main {
        private Country country;
        @Autowired
        @Qualifier("country")
        public void setCountry(Country country) {
            this.country = country;
        }
    }
    

    이것은 영국이 미국 콩에 id를 추가하고 그것을 사용한다면 미국을 원한다.

  3. ==============================

    3.동일한 결과를 얻는 또 다른 방법은 @Value 주석을 사용하는 것입니다.

    동일한 결과를 얻는 또 다른 방법은 @Value 주석을 사용하는 것입니다.

    public class Main {
         private Country country;
    
         @Autowired
         public void setCountry(@Value("#{country}") Country country) {
              this.country = country;
         }
    }
    

    이 경우 "# {country} 문자열은 country라는 bean으로 평가되는 Spring Expression Language (SpEL) 표현식입니다.

  4. ==============================

    4.이름으로 해결할 수있는 또 하나의 솔루션 :

    이름으로 해결할 수있는 또 하나의 솔루션 :

    @Resource(name="country")
    

    javax.annotation 패키지를 사용하기 때문에 Spring과 관련이 없지만 Spring은이를 지원합니다.

  5. ==============================

    5.경우에 따라 @Primary 주석을 사용할 수 있습니다.

    경우에 따라 @Primary 주석을 사용할 수 있습니다.

    @Primary
    class USA implements Country {}
    

    이렇게하면 다른 빈에서 autowire-candidate를 사용할 필요없이 기본 autowire 후보로 선택됩니다.

    mo deatils for look on 동일한 인터페이스를 구현하는 두 개의 빈을 Autowiring - 기본 빈을 autowire로 설정하는 방법?

  6. from https://stackoverflow.com/questions/4447877/how-does-spring-autowire-by-name-when-more-than-one-matching-bean-is-found by cc-by-sa and MIT license