on
[Spring] Bean이 여러 개 조회 - NoUniqueBeanDefinitionException
[Spring] Bean이 여러 개 조회 - NoUniqueBeanDefinitionException
728x90
에러 내역
"expected single matching bean but found *"빈을 주입할 때 여러개의 빈이 조회가 되면 에러가 발생한다.
해결 방법은 3가지가 있다.
@Autowired 필드명
@Qualifier
@Primary
@Autowired 필드명
@Autowired에서 여러 빈이 매칭되면, 필드의 이름으로 매칭한다.
변경 전 변경 후
변경전 코드에서 DiscountPolicy가 여러개 매칭되어 문제가 발생하였다. DiscountPolicy의 필드명 discountPolicy를 매칭할 빈의 이름으로 변경을 해준다면 문제가 해결된다.
@Qualifier
@Qualifier은 구분할 수 있는 조건을 하나 더 추가하는 방법이다.
겹치는 빈 1 겹치는 빈 2
겹쳐지는 빈들 대상으로 @Qualifier을 사용하여 추가적인 이름을 붙여 준다.
필드 앞에 @Qualifier 추가
필드 앞에 @Qualifer을 추가하여 어떤 빈을 사용할 것인지 적어준다.
@Primary
@Primary는 우선순위를 지정하는 방법이다. 여러 빈이 매칭될 때 @Primary가 붙은 빈이 사용된다.
@Primary를 붙인 모습
겹치는 빈 중에서 많이 쓰는 빈이 있다면 @Primary를 붙이고 적게 사용하는 빈은 그 외의 방법을 사용하면 된다.
RateDiscountPolicy를 90% 사용하고 FixDiscountPolicy를 10% 정도 사용하면 @Primary를 RateDiscount에 사용하고 그 외의 경우에는 @Qualify나 혹은 @Autowired가 붙은 생성자의 필드에 이름을 지정하는 식으로 사용하면 된다.
@Primary를 사용하면 @Qualify보다 작성해야 하는 코드가 줄어들기 때문에 간단하다는 장점이 있다.
728x90
from http://sdardew-valley.tistory.com/133 by ccl(A) rewrite - 2021-12-07 14:27:19