Spring Framework에서 DI Dependency Injection를 할 때 사용하는 어노테이션 Annotaion이다.
@Autowired는 타입 클래스이름을 통해 Bean을 조회 한다.
그렇다면 Bean이 다수일 경우에는 어떻게 될까?
Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
조회 타입 1개를 기대했는데, 2개 혹은 여러개가 있다는 오류를 발생시킨다.
이는 조회의 기본 Defaul값이 1개로 설정되어있고, 2개 이상이면 오류를 발생하도록 되어있기 때문이다.
@Autowired는 타입 매칭을 시도하고, 이때 빈이 여러개가 있으면 먼저 파라미터 이름으로 빈 이름을 추가 매칭시도한다.
@qualifier는 추가 구분자를 붙이는 방법이다. 각 빈을 구분하는 추가적인 방법을 제공하는 것일 뿐, 빈 이름을 변경하는 것은 아니다
@Autowired // discountPolicy가 여러개일 경우 각각의 구분자로 구분하는 방법
public OrderServiceImpl(MemberRepository memberRepository,@Qualifier("rate") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
직접 빈을 등록하는 경우에도 가능하다.
@Bean
@Qualifier("member")
public MemberService memberService(){
System.out.println("call AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Primary는 우선순위를 부여하는 방법이다
여러 Bean이 존재하면 @Primary를 가진 빈이 우선권을 가진다
@Component
@Primary // 둘 중에서는 Primary가 조회된다!
public class RateDiscountPolicy implements DiscountPolicy{
...
@Component
public class FixDiscountPolicy implements DiscountPolicy{
...
그렇다면 @Primary와 @Qualifier이 둘 다 존재한다면 어떤것이 우선순위를 가질까?
스프링은 자동보다는 수동, 넓은 범위의 선택 보다는 좁은 범위의 선택이 우선순위를 가진다
@Primary는 기본값 넓게 적용으로 적용시키는 것이고
@Qualifier은 상대적으로 더 상세하게 동작한다.
따라서 @Qualifier가 우선권을 가진다!