본문 바로가기
백엔드개발자/SPRING, JPA 등...

의존성 주입 -조회 빈이 2개 이상

by 보혀니 2022. 6. 22.
@Autowired
private DiscountPolicy discountPolicy
@Component
public class FixDiscountPolicy implements DiscountPolicy {}


@Component
public class RateDiscountPolicy implements DiscountPolicy {}

 FixDiscountPolicy, RateDiscountPolicy 둘 다 스프링 빈으로 선언을 하고 의존성 주입을 하면?

NoUniqueBeanDefinitionException << 오류 발생

그렇다면 어떻게 해결 해야하는가???

 

해결방법

1. @Autowired 필드명 매칭

2. @Qualifier 끼리 매칭 (빈 이름 매칭)

3. @Primary 사용

 

 

 

 

@Autowired

필드명 매칭.

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

@Autowired
private DiscountPolicy rateDiscountPolicy

 >> 필드 명을 빈 이름으로 변경

필드명이 rateDiscountPolicy 이므로 빈 rateDiscountPolicy가 주입된다.

 

 

@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;
	}

 

 

 

@Primary

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

@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}


@Component
public class FixDiscountPolicy implements DiscountPolicy {}

>> 이렇게 하면 @Primary를 달고 있는 rateDiscountPolicy 빈이 우선권을 가지게 된다.