@Autowired는 타입으로 의존성을 주입해준다
타입으로 조회하면 선택된 빈이 두 개 이상 일때 문제가 발생한다.
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowired
private DiscountPolicy discountPolicy
위와 같이 빈이 두개 이상이고 타입으로 조회하는 @Autowired가 의존성 주입하려고 시도하면
NoUniqueBeanDefinitionException 예외 발생.
그러면 @Autowired로 의존관계 주입해주는 클래스를 fixDiscountPolicy, rateDiscountPolicy 등 하위타입으로 지정해주면 되는 거 아닌가?! → 하위타입으로 지정해주는 것은 DIP가 유배되고 유연성 떨어짐! 그리고 이름만 다르고 완전히 똑같은 타입의 스프링 빈이 2개 있을 때 해결이 안된다!
빈을 수동등록 해도 되겠지만, 의존관계 자동 주입에서 해결하는 3가지 방법이 있음!
@Autowired 필드 명 매칭
@Autowired
private DiscountPolicy rateDiscountPolicy
@Qualifier 사용 (qualify : 자격을 얻다. 예선 통과자)
@Component
@Qualifier("mainDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
@Qualifier("mainDiscountPolicy") DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}