이번에는 여러개의 빈이 선택될때 3가지 방법을 알아보았다.
1. @Autowired 필드 명 매칭
2. @Qualifier -> @Qualifier -> 빈 이름 매칭
3. @Primary 사용
@Autowired 필드 명 매칭
@Autowired 필드 명 매칭이란 무슨 말이지?
@Autowired는 특이한 기능이 있다. @Autowired는 타입 매칭을 시도하고,
이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.
기존 코드
@Autowired
private DiscountPolicy discountPolicy
필드 명을 빈 이름으로 변경
@Autowired
private DiscountPolicy rateDiscountPolicy
2개의 빈 중에 필드 명이나 파라미터 이름을 보고 2개의 빈 중 빈이름이 같은 것이 있다면 찾아온다.
@Autowired 매칭 정리를 하자면
1. 타입 매칭
2. 타입 매칭의 결과가 2개 이상일때 필드 명 또는 파라미터 명으로 빈 이름 매칭
@Qualifier 사용
@Qualifier는 추가 구분자를 붙여주는 방법이다. 주입시 추가적인 방법을 제공하는 것이지 빈 이름을 변경하는 것은 아니다.
빈 이름 등록시 @Qualifier를 붙여준다.
@Component
@Qualifier("mainDiscountPolicy")
public class FixDiscountPolicy 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")를 못찾으면 어떻게 될까? 그러면
mainDiscountPolicy라는 이름의 스프링 빈을 추가로 찾는다.
직접 빈 등록시에도 @Qualifier를 사용 가능하다.
@Qualifier 정리
1. @Qualifier끼리 매칭
2. 빈 이름 매칭
3. NoSuchBeanDefinitionException 예외 발생
@Primary 사용
@Primary는 우선순위를 지정하는 방법이다. @Autowired 시에 여러 빈이 매칭되면 @Primary가 붙은 클래스가 우선권을 가진다.
package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy{
private int discountPercent = 10;
@Override
public int discount(Member member, int price) {
if(member.getGrade() == Grade.VIP){
return price * discountPercent / 100;
} else{
return 0;
}
}
}
매우 심플하기때문에 자주 쓰인다고 한다.
여기까지 보면 @Primary와 @Qualifier 중 어떤것을 사용하면 좋을지 고민이 될 것인데
@Qualifier의 단점은 주입 받을 시에 모든 코드에 @Qualifier를 붙여주어야 한다는 점이다.
반면에 @Primary 를 사용하면 @Qualifier를 붙일 필요가 없다.
우선순위에 있어서는
@Primary 보다는 @Qualifier가 더 높다
스프링은 자동보다는 수동이 , 넓은 범위의 선택권 보다는 좁은 범위의 선택권이 우선 순위가 높듯이
이 문제 또한 마찬가지로 @Qualifier가 더 높다
'웹프로그래밍 > Spring 핵심 원리' 카테고리의 다른 글
41. 조회한 빈이 모두 필요할 때, List, Map (0) | 2021.08.18 |
---|---|
40. 애너테이션 직접 만들기 (0) | 2021.08.18 |
38. 조회 빈이 2개 이상 - 문제 (0) | 2021.08.17 |
37. 롬복과 최신 트렌드 (0) | 2021.08.16 |
36. 생성자 주입을 선택하라 (0) | 2021.08.16 |