- @AutoWired는 의존관계 주입을 위해서 생성자의 파라미터 Type으로 스프링 빈을 찾음

- 이때 찾은 빈이 2개 이상이면 오류가 발생함

NoUniqueBeanDefinitionException: No qualifying bean of type 'com.example.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
@Component
public class FixDiscountPolicy implements DiscountPolicy{
	......
}

@Component
public class RateDiscountPolicy implements DiscountPolicy{
	......
}

=> DiscountPolicy라는 Type으로 찾은 빈이 2개라 오류 발생함

 

 

찾은 빈이 2개 이상인 경우 어떤 빈을 사용?

1. @AutoWired 필드 이름, 생성자 파라미터 이름 매칭

생성자 파라미터 Type으로 찾음 => 2개 이상 => 필드 이름, 생성자 파라미터 이름으로 찾음

private final DiscountPolicy rateDiscountPolicy;

 

2. @Qualifier

- 추가로 구분할 수 있는 수단 제공

@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy{
	......
}

@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy{
	......
}
@Component
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy 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{
	......
}

 

ex)

main DB connection 빈 <- @Primary로 지정

sub DB connection 빈 <- @Qualifier로 지정