의존 관계 자동 주입 - 조회 빈 2개이상

박찬우·2023년 12월 17일
0

스프링

목록 보기
19/88

  • 예시
  1. DiscountPolicy 2개 - fixDiscountPolicy, rateDiscountPolicy
@Component 
public class FixDiscountPolicy implements DiscountPolicy {}
@Component 
public class RateDiscountPolicy implements DiscountPolicy {}
  1. 의존 관계 자동 주입
@Autowired 
private DiscountPolicy discountPolicy
  1. 오류 발생
NoUniqueBeanDefinitionException: No qualifying bean of type 
'hello.core.discount.DiscountPolicy' available: expected single matching bean 
but found 2: fixDiscountPolicy,rateDiscountPolicy
  • 해결방법(@Autowired 필드명)
    • @Autowired는 타입 매칭의 결과가 2개 이상일 때 필드 명, 파라미터 명으로 빈 이름 매칭
    • 필드 명을 빈 이름으로 변경
@Autowired 
// private DiscountPolicy discountPolicy
private DiscountPolicy rateDiscountPolicy
  • 해결방법(@Qualifier 사용)
@Component 
@Qualifier("mainDiscountPolicy") 
public class RateDiscountPolicy implements DiscountPolicy {}
@Component 
@Qualifier("fixDiscountPolicy") 
public class FixDiscountPolicy implements DiscountPolicy {}
@Autowired 
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {    
	this.memberRepository = memberRepository;
	this.discountPolicy = discountPolicy; 
}
  • 해결방법(@Qualifier 사용 - 애노테이션 생성)
    • @Qualifier("mainDiscountPolicy") 문자로 지정 할 경우 오타가 나도 컴파일 과정에서 잡지 못함 그래서 애노테이션을 혼합하여 사용하기도함
      (@Qualifier 내용을 가져와서 합함)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy { }
@Component 
@MainDiscountPolicy 
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowired 
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
    this.memberRepository = memberRepository; 
    this.discountPolicy = discountPolicy; 
}
  • 해결방법(@Primary 사용)
    • 우선순위를 정하는 기법
    • @Autowired 시에 여러 빈이 매칭되면 @Primary 가 우선권을 가짐
@Component 
@Primary 
public class RateDiscountPolicy implements DiscountPolicy {}
@Component 
public class FixDiscountPolicy implements DiscountPolicy {}
@Autowired 
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
	this.memberRepository = memberRepository;   
    // RateDiscountPolicy를 가져옴
	this.discountPolicy = discountPolicy; 
}
  • @Primary와 @Qualifier 사용 경우

    • @Primary : 자주 사용하는 경우(예 : 메인 데이터베이스)
    • @Qualifier : 드문 드문 사용하는 경우(예 : 보조 데이터베이스)
  • 우선 순위

    • @Primary와 @Qualifier를 같이 쓰는 경우 @Qualifier이 우선권이 높음(스프링은 자동보다는 수동 넓은 범위보다는 작은 범위가 우선권을 가짐)
profile
진짜 개발자가 되어보자

0개의 댓글