DiscountPolicy
(interface)rateDiscountPolicy
fixDiscountPolicy
위와 같이 인터페이스와 구현체가 있고,
모두 스프링 빈으로 등록한 상태다.
@Autowired
private DiscountPolicy discountPolicy
그리고 위 코드로 호출을 했을 때,
충돌이 난다고 가정한다.
@Autowired
private DiscountPolicy rateDiscountPolicy
위와 같이, 구현체의 이름을 필드명으로 한다면 그에 해당하는 빈을 찾는다.
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
구현체마다 Qualifier를 지정한다.
실제로 빈의 이름을 바꾸는 것이 아닌, 단순 식별자라는 것에 유의한다.
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
특정 구현체에 우선권을 부여한다.
@Autowired
필드명을 통한 구현체 지정은 DIP를 위반하므로 논외
우선 순위
@Qualifier
로 특정 구현체를 지정했지만,
@Primary
를 지정한 구현체가 별도로 있는 경우,
-> @Qualifier
로 지정한 구현체가 우선권을 가진다.
권장 사용법
메인 구현체를 @Primary
,
가끔 쓰는 구현체를 @Qualifier
로 지정해주는 것이 편하다.