본문 바로가기
Back-End/Spring Boot

의존관계 자동 주입 - 조회 빈이 2개 이상일 때: @Autowired 필드 명, @Qualifier, @Primary

by 달의 조각 2022. 3. 21.
이 글은 김영한 님의 스프링 핵심 원리 - 기본편을 수강하며 정리한 글입니다.

 

 

@Autowired 필드 명 매칭

 

@Autowired는 먼저 타입 매칭을 시도한 후, 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.

@Autowired
private DiscountPolicy rateDiscountPolicy
  1. DiscountPolicy 타입을 조회하면 fixDiscountPolicy, rateDiscountPolicy가 조회된다.
  2. rateDiscountPolicy가 매칭된다.

 


 

@Quilfier

 

구분할 수 있는 추가 옵션(제2의 이름)을 제공한다. 모든 코드에 @Qualifier를 붙여 주어야 한다는 단점이 있다.

@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
	this.memberRepository = memberRepository;
	this.discountPolicy = discountPolicy;
}

 


 

@Primary

 

우선순위를 정하는 방법이다. @Autowired 시에 여러 빈이 매칭되면 @Primary가 우선권을 가진다.

@Component
@Primary // rateDiscountPolicy가 우선권을 가진다
public class RateDiscountPolicy implements DiscountPolicy {}

 


 

우선 순위

스프링은 자동보다는 수동이, 넒은 범위의 선택권보다는 좁은 범위의 선택권이 우선 순위가 높다.

  • @Primary: 기본값처럼 동작
  • @Qualifier: 매우 상세하게 동작

댓글