@Autowired 로 의존 관계를 넣어줄 때 빈을 타입으로 조회하게 된다.
완전 똑같진 않지만, .getBean(MemberRepository.class) 와 비슷한 방식으로 빈을 찾아서 의존 관계를 넣어준다.
이때, MemberRepository 의 구현체가 2개 이상이라면 문제가 발생한다.
조회 시 자식이 모두 조회되어 2개 이상의 빈이 있는데, 이 중 어떤 걸 의존 관계로 넣어줘야 할지 모르기 때문.
수동으로 의존관계를 넣어줄 수 있지만, 자동으로도 해결 가능한 몇 가지 방법이 있다.
1. @Autowired 필드 명 매칭
2. @Qualifer 끼리 매칭
3. @Primary로 우선순위 선정
@Autowired 는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.
@Autowired 워크플로우
1. 타입 매칭을 시도하고, 만약 빈이 하나면 매칭 진행, 두 개 이상이면
2. 필드 명 혹은 파라미터 명으로 빈 이름 매칭 진행.
@Qualifier 사용
주입시 추가적인 방법을 제공.
@Qualifier("특정이름") 을 클래스에 붙이고, 의존관계 주입하는 파라미터 혹은 필드 앞에 동일한 어노테이션을 붙이면
@Qualifier 끼리 매칭되어 자동으로 의존관계를 넣어 준다.
이때, @Qualifier 끼리 매칭이 안되면, 빈 이름 중 "특정이름"과 동일한 게 있는지 찾아 넣는다 --> 이거는 매우 헷갈리니 쓰지 말자!
그래도 없으면 NoSuchBeanDefinitionException 발생
@Component
@Qualifier("mainMemberRepository")
public class MemortMemberRepository {
...
}
@Component
public class MemberServiceImpl {
private final MemberRepository memberRepository;
@Autowired
MemberServiceImpl(@Qualifier("mainMemberRepository") MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
@Primary 사용
우선순위를 정하는 방법이다.
@Autowired 시 여러 빈이 매칭 되면, @Primary 가 붙어있는 빈을 먼저 선택한다.
'코딩 > JAVA 공부' 카테고리의 다른 글
| [Spring] 웹애플리케이션 이해 - Servlet (0) | 2023.06.03 |
|---|---|
| [Spring] 빈 스코프 (0) | 2023.05.20 |
| [Spring] DI 옵션 처리, 롬복과 최신 트랜드 (0) | 2023.05.16 |
| [Spring] 의존성 관계 자동 주입 (1) | 2023.05.14 |
| [Spring] 컴포넌트 스캔 (0) | 2023.05.13 |