[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.이것은 Spring 3.0 매뉴얼의 3.9.3 절에 설명되어있다.
이것은 Spring 3.0 매뉴얼의 3.9.3 절에 설명되어있다.
즉, 기본 동작은 setter 메서드에 @Qualifier ( "country")를 추가 한 것과 같습니다.
-
==============================
2.@Qualifier 주석을 사용할 수 있습니다.
@Qualifier 주석을 사용할 수 있습니다.
여기에서
한정자를 사용하여 주석 기반 자동 와이어 링 미세 조정
유형별 자동 와이어 링은 여러 후보로 이어질 수 있으므로 선택 프로세스를보다 잘 제어 할 필요가 있습니다. 이를 수행하는 한 가지 방법은 Spring의 @Qualifier 주석을 사용하는 것입니다. 이를 통해 한정자 값을 특정 인수와 연결하여 유형 일치 집합을 좁혀 각 인수에 대해 특정 bean을 선택하도록합니다. 가장 단순한 경우이 값은 일반적인 설명 값일 수 있습니다.
class Main { private Country country; @Autowired @Qualifier("country") public void setCountry(Country country) { this.country = country; } }
이것은 영국이 미국 콩에 id를 추가하고 그것을 사용한다면 미국을 원한다.
-
==============================
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.이름으로 해결할 수있는 또 하나의 솔루션 :
이름으로 해결할 수있는 또 하나의 솔루션 :
@Resource(name="country")
javax.annotation 패키지를 사용하기 때문에 Spring과 관련이 없지만 Spring은이를 지원합니다.
-
==============================
5.경우에 따라 @Primary 주석을 사용할 수 있습니다.
경우에 따라 @Primary 주석을 사용할 수 있습니다.
@Primary class USA implements Country {}
이렇게하면 다른 빈에서 autowire-candidate를 사용할 필요없이 기본 autowire 후보로 선택됩니다.
mo deatils for look on 동일한 인터페이스를 구현하는 두 개의 빈을 Autowiring - 기본 빈을 autowire로 설정하는 방법?
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
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 MVC : @RequestParam과 @ModelAttribute의 차이점을 설명하십시오. (0) | 2019.01.26 |
---|---|
[SPRING] Spring 3.x JSON 상태 406 "요청에 따라 수용 할 수없는 특성"accept "headers ()" (0) | 2019.01.26 |
[SPRING] Spring OAuth2 - 토큰 저장소에 수동으로 액세스 토큰 생성 (0) | 2019.01.26 |
[SPRING] Spring MVC의 폼 사용 : 데이터를 바인딩하는 체크 박스 (0) | 2019.01.26 |
[SPRING] Spring 부트 - Application.properties의 사용자 정의 변수 (0) | 2019.01.26 |