하나 이상의 일치하는 빈이 발견되면 Spring은 어떻게 이름으로 자동 연결됩니까?


106

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

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를 사용하고 있습니다.


내가 하나의 (테스트) 환경에서 "No unique bean of type ..."을 얻었고 내 개발 환경에서 잘 작동한다고 덧붙일 것이라고 생각했습니다. 나는 그것이 일종의 클래스 경로 일 것이라고 확신하지만 @Qualifier를 추가하면 잘 작동했습니다.
markthegrea

답변:


113

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

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

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


"bean name"이라고 말할 때 bean이 포함될 필드의 이름을 의미합니까? (즉,이 경우 country)
기금 모니카의 소송

67

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

에서 여기

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

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

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

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


12

동일한 결과를 얻는 또 다른 방법은 @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.


속성에 따라 주입 할 수 있습니까? USA 또는 UK가 URL에서 오는 매개 변수의 일종이고 매개 변수가 무엇인지에 따라 두 가지를 주입하려면 어떻게해야합니까?
Kalpesh Soni

6

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

@Resource(name="country")

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


1
하지만 @Resource아웃 - 오브 - 박스 자바 (11)로 인해 퍼즐 모듈 없을 것
더크 호프만

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.