autowired는 처음에 타입 매칭을 시도하고, 이 때 빈이 여러 개 있다면 필드 이름, 파라미터 이름으로 빈을 추가 매칭한다.
따라서 이름을 바꿔서 구분해주면 해결된다.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = rateDiscountPolicy;
}
@Qualifier를 통해서 구분을 해준다.
클래스빈에 특별한 이름을 부여해주고 인수에 넣어주면 이름에 맞는 빈을 넣어준다.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
만약 같은 이름의 qualifier를 못찾으면 같은 이름을 가진 스프링 빈을 찾아서 쓰려고한다. 따라서 퀄리파이어 이름은 이 용도로만 명확하게 사용해야한다.
자주 쓰는거에 Primary를 걸어주면 그걸 우선적으로 사용한다.
주로 Primary를 메인으로 쓰는것에 걸어두고, 나머지에는 Qualifier를 걸어둔다.