- @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로 지정
'WEB > spring' 카테고리의 다른 글
[Spring] 스프링 빈 생명주기와 콜백 메서드, @PostConstruct, @PreDestroy (0) | 2021.04.18 |
---|---|
[Spring] 자동 빈 등록(@Component) vs 수동 빈 등록(@Bean) (0) | 2021.04.18 |
[Spring] 의존관계 주입 방법(생성자/수정자/필드/메서드 주입) (0) | 2021.04.17 |
[Spring] 컴포넌트 스캔, @ComponentScan, @AutoWired (0) | 2021.04.16 |
[Spring] 싱글톤 패턴, 싱글톤 컨테이너, CGLIB (0) | 2021.04.15 |