@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 빈이 우선권을 가지게 된다.
'백엔드개발자 > SPRING, JPA 등...' 카테고리의 다른 글
RedirectAttributes (0) | 2022.10.12 |
---|---|
@RestController, @ResponseBody, @Controller (0) | 2022.07.24 |
HttpServletRequest (0) | 2022.06.21 |
@RequestMapping 이 기억이 안나 (@PostMapping, @GetMapping) (0) | 2022.05.13 |
회원등록 API (0) | 2022.04.19 |