[spring] 하나 이상의 일치하는 빈이 발견되면 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"/>

아래에서 자동 연결되는 종속성을 어떻게 제어 할 수 있습니까? 영국을 원합니다.

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

Spring 3.0.3.RELEASE를 사용하고 있습니다.



답변

이것은 Spring 3.0 매뉴얼의 섹션 3.9.3 에 문서화되어 있습니다.

대체 일치의 경우 Bean 이름은 기본 규정 자 값으로 간주됩니다.

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


답변

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

에서 여기

한정자를 사용하여 주석 기반 자동 연결 미세 조정

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

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

이것은 UK를 사용하여 USA bean에 ID를 추가하고 USA를 원한다면 사용합니다.


답변

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

public class Main {
     private Country country;

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

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


답변

이름으로 확인하는 또 다른 솔루션 :

@Resource(name="country")

javax.annotation 패키지를 사용 하므로 Spring에 한정되지 않지만 Spring은이를 지원합니다.


답변

어떤 경우에는 @Primary 주석을 사용할 수 있습니다.

@Primary
class USA implements Country {}

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

mo deatils를 위해 동일한 인터페이스를 구현하는 두 개의 빈Autowiring-기본 빈을 autowire로 설정하는 방법은 무엇입니까?


답변