programing

일치하는 콩이 두 개 이상 발견될 때 스프링은 어떻게 이름으로 자동 배선됩니까?

nicegoodjob 2023. 3. 6. 22:22
반응형

일치하는 콩이 두 개 이상 발견될 때 스프링은 어떻게 이름으로 자동 배선됩니까?

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

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을 사용하고 있습니다.풀어주다.

이는 스프링 3.0 매뉴얼의 섹션 3.9.3에 설명되어 있습니다.

폴백 일치의 경우 빈 이름은 기본 수식자 값으로 간주됩니다.

즉, 기본 동작은 다음과 같습니다.@Qualifier("country")세터 메서드로 이동합니다.

@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}string은 Spring Expression Language(SPEL; 봄식 언어) 표현으로 다음 이름의 빈을 평가합니다.country.

이름별로 해결 방법을 하나 더 소개합니다.

@Resource(name="country")

javax.annotation 패키지를 사용하기 때문에 Spring 고유의 패키지는 아니지만 Spring이 지원합니다.

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

@Primary
class USA implements Country {}

이렇게 하면 기본 자동배선 후보로 선택되므로 다른 쪽 빈에서 자동배선 후보가 필요하지 않습니다.

mo deatils 에 대해서는, 「두 개의 콩의 자동 배선 실장」을 참조해 주세요.「 default bean 」를 autowire로 설정하는 방법.

언급URL : https://stackoverflow.com/questions/4447877/how-does-spring-autowire-by-name-when-more-than-one-matching-bean-is-found

반응형