스프링 빈 중복 조회

이연희·2022년 2월 5일
0

Spring

목록 보기
36/105
post-custom-banner

조회할 빈이 2개 이상일 때

🔹 @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. @Autowired 필드명

🔹 1)타입 매칭을 시도하고 여러 빈이 있으면 2)필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.

//기존 코드
@Autowired
private DiscountPolicy discountPolicy
//필드 명을 빈 이름으로 변경
@Autowired
private DiscountPolicy rateDiscountPolicy

2. @Quailifier

🔹 빈 등록시 @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;
}

3. @Primary

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

@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
profile
공부기록
post-custom-banner

0개의 댓글