헉 이제 규칙적인 생활해야지
오늘 8강까지 듣고, 한언사 수업도 듣고 해야하는데...??
컴연방은 차근히 목요일까지 듣도록하고,,, 🥲 일단 강의부터 집중하자...
📌 조회 빈이 두개 있을 때
📌 의존 관계 자동 주입에서 해결하는 방법
@Autowired
는 타입으로 빈을 조회하게 된다. 상황 1.
@Autowired
private DiscountPolicy discountPolicy;
//DIP를 따르기 위해 구체 클래스가 아닌 인터페이스에 의존
➡️ 따라서 구체 클래스가 아닌, 인터페이스로 조회하게 된다.
⚠️ 이때 인터페이스를 구현한 빈이 두개 이상인 경우를 생각해보자.
//DiscountPolicy → 구현: FixDiscountPolicy , RateDiscountPolicy
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
상황 2.
AutoAppConfig.class ➡️ 컴포넌트 스캔 !
DiscountPolicy → 구현: FixDiscountPolicy , RateDiscountPolicy
💻 실행화면
➡️ ⚠️ 오류 메시지
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'orderServiceImpl' defined in file [C:\Users\USER\OneDrive -
pusan.ac.kr\core\core\out\production\classes\hello\core\order\OrderServiceImpl.class]:
Unsatisfied dependency expressed through constructor parameter 1; nested exception
is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type 'hello.core.discount.DiscountPolicy' available:
expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
1. 스프링 빈을 수동 등록
2. 의존 관계 자동 주입에서 해결하는 방법
@Autowired
필드 명@Autowired
는 타입 매칭을 시도@Autowired
private DiscountPolicy discountPolicy
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository,
DiscountPolicy rateDiscountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = rateDiscountPolicy;
}
😀 "오~ 여러빈이 있군! 그러면 파라미터명으로 빈을 찾아야겠어~"
@Qualifier
→ @Qualifier
끼리 매칭 → 빈 이름 매칭@Qualifier
: 구분할 수 있는 추가적인 옵션을 하나 제공하는 것이다. ( 빈 이름을 바꾸는 것 ❌)@Qualifier("이름")
설정@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {
@Qualifier("mainDiscountPolich")
public class RateDiscountPolicy implements DiscountPolicy {
@Qualifier("이름")
설정@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository,
@Qualifier("mainDiscountPolich") DiscountPolicy discountPolicy) { //추가
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
위의 예제는 컴포넌트 자동 주입의 예제이다. 그러나 빈 등록 시에도 동일하게 사용할 수 있따.
해당 이름을 못찾으면, 해당이름을 가진 스프링 빈을 추가로 찾는다.
그러나 이런식으로 사용하기 보다는, 명확하게 사용하는 것이 좋다.
🙆 다시 상기하자! 명확하지 않은 코드는 짜지말자!!
➡️ 해결 완료~! 🙆
😀 "오~ @Qualifier("이름")을 보고 등록하면 되겠군~ "
@Primary
👏 자주 사용하는 방법?
@Primary
예약어를 붙이면 된다.@Primary
: 예약어 사용@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {
}
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
➡️ 해결 완료~! 🙆
@Primary
vs @Qualifier
➡️ 자세한 것 > 덜 상세한 것
따라서@Qualifier
이 우선순위가 높다.
요새 계속 배가 아프다...
정리가 잘 된 글이네요. 도움이 됐습니다.