@Autowired는 Type으로 조회함
타입으로 조회하면 선택된 빈이 2개 이상일때 문제가 발생.
@Component
public lass FixDiscountPolicy implements DiscountPolicy {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
//의존관계 주입
@Autowired
private DiscountPolicy discountPolicy
//오류발생
//NoUniqueBeanDefinitionException - 2개의 빈이 발견됨
조회 대상 빈이 2개 이상일때 해결방법
1. @Autowired 필드명 매칭
2. @Qualifier -> @Qalifier끼리 매칭 -> 빈이름 매칭
3. @Primary사용
@AutoWired 필드명 매칭
- 타입 매칭을 시도
- 타입 매칭의 결과가 2개 이상일 때 필드명, 파라미터명으로 빈 이름을 추가 매칭
@Qualifer사용
- @Qualifer는 추가 구분자를 붙여주는 방법. 주입시 추가적인 방법을 제공하는 것이지 빈 이름을 변경하는 것은 아님
- @Qualifier 끼리 매칭
- 빈 이름 매칭
- 정의되어 있지 않으면 NoSuchBeanDefinitionException 예외 발생
- @Qualifier는 @Qualifier를 찾는 용도로만 사용하는게 명확하고 좋음
@Primary사용
- 우선순위를 정하는 방법
- @Autowired시에 여러 빈이 매칭되면 @Primary가 우선권을 가짐
@Qualifer, Primary활용법
- 자주 사용하는 메인 데이터 베이스의 커넥션 빈을 획득하는 스프링 빈은 @Primary를 적용해서 조회하는 곳에서 @Qualifere지정없이 편리하게 조회하고
- 특별한 기능으로 가끔 사용하는 서브 데이터베이스 커넥션 빈을 획득할 때는 @Qualifer를 지정해서 명시적으로 획득하는 방식으로 사용하면
- 코드를 깔끔하게 유지할 수 있음
- 메인 데이터베이스의 스프링빈을 등록할때 @Qualifer를 지정해주는 것은 상관없음
- 스프링은 자동보다는 수동이, 넓은 범위의 선택권 보다는 좁은 범위의 선택권이 우선순위가 높아서 @Primary보다 @Qualifer의 우선권이 높다
Annotation을 직접 만드는건
https://shinsunyoung.tistory.com/83
이분의 블로그를 보니 이해하기 좋았다
'spring > 스프링' 카테고리의 다른 글
| 라이프사이클 콜백 (InitializingBean, DisposableBean / @PostConstruct, @PreDestory / initMethod, destroyMethod) (0) | 2023.03.13 |
|---|---|
| 수동 빈 등록을 사용하는 경우 - 업무로직빈, 기술지원빈 (0) | 2023.03.12 |
| 롬복 라이브러리(Lombok) (0) | 2023.03.12 |
| 의존관계 주입 (0) | 2023.03.12 |
| 컴포넌트 스캔 (0) | 2023.03.10 |
댓글