🔹 @Autowired는 타입(Type)으로 조회한다.
🔹 타입으로 조회하기 때문에 다음 두 코드는 유사하게 동작한다.
//1
@Autowired
private DiscountPolicy discountPolicy
//2
ac.getBean(DiscountPolicy.class)
🔹 DiscountPolicy의 하위 타입인 FixDiscountPolicy, RateDiscountPolicy가 스프링 빈으로 선언되어 있을 때
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
🔹 의존관계 자동 주입 실행
@Autowired
private DiscountPolicy discountPolicy
🔹 "NoUniqueBeanDefinitionException" 오류 발생: FixDiscountPolicy, RateDiscountPolicy 2개가 발견됨을 알려준다.
🔹 하위 타입으로 지정할 수 있지만 이는 DIP를 위배하고 유연성이 떨어진다.
🔹 1)타입 매칭을 시도하고 여러 빈이 있으면 2)필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.
//기존 코드
@Autowired
private DiscountPolicy discountPolicy
//필드 명을 빈 이름으로 변경
@Autowired
private DiscountPolicy rateDiscountPolicy
🔹 빈 등록시 @Qualifier 어노테이션 사용
🔹 주입시 @Qualifier 붙이고 등록한 이름 사용
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy 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;
}
🔹 우선순위를 정하는 방식
🔹 @Autowired 시에 여러 빈이 매칭되면 @Primary가 우선권을 가진다.
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}