이전 글에서는 빈의 의존성이 1개인 경우만 공부해봤습니다. 해당하는 타입의 빈이 복수개일 경우는 어떻게 처리되는지 살펴보겠습니다.
BookRepository라는 인터페이스를 구현한 클래스 2개가 존재한다고 가정하겠습니다. 아래 스크린샷을 참고해주세요.
이 상황에서 BookService가 의존성 주입을 하게 되면 에러를 뱉게 됩니다. MyBookRepo랑 YourBookRepo중 어느 것을 선택해서 주입해야 될지 스프링이 판단하지 못하는 상황입니다.
3가지의 액션을 통해 이러한 상황을 해결할 수 있는데 하나씩 살펴보도록 하겠습니다.
@Primary
원하는 빈에 @Primary를 선언하여 동일한 빈일 경우 @Priamry라는 어노테이션이 붙은 빈을 주입해주게 만들 수 있습니다.
@Qualifier("빈의 이름")
빈의 이름은 small case로 시작하는 클래스의 이름과 동일하게 됩니다.
타입에 해당하는 모든 빈을 받기
아래와 같이 리스트를 활용해 모든 빈을 다 받을 수 있습니다. 1개면 1개 2개면 2개 n개면 n개를 받을 수 있습니다.
이름 직접 명시
그리고 이외에 추천하지 않는 방식이 한 가지 있는데 빈의 이름을 직접 명시하여 주입하는 방법입니다. 해당하는 타입의 빈이 여러 개일 경우 아래와 같이 이름을 직접 명시하여 의존성 주입이 가능하게 됩니다.
Autowire의 동작 원리는?
어떻게 동작하는 것이 궁금하실 수 있는데 BeanPostProcessor 라이프사이클 인터페이스의 구현체에 의해서 동작을 하게 됩니다. 검색 중 자세하게 설명해주신 좋은 글이 있어 링크하니 궁금하신 분들은 참고하시면 좋겠습니다.
heowc.dev/2020/07/04/how-does-autowired-work/
'Spring' 카테고리의 다른 글
스프링의 핵심 원리 - 2(좋은 객체 지향 설계의 5가지 원칙 SOLID) (0) | 2021.01.08 |
---|---|
스프링의 핵심 원리 - 1 (객체지향에서의 다형성) (0) | 2021.01.07 |
Autowire 알아보기 - 1 (0) | 2020.09.27 |
AOP를 활용한 Logging 구현 (1) | 2020.08.09 |
Spring Web Layer 알아보기 (0) | 2020.07.12 |