테스트 코드로 진행하겠다.
등록된 빈 보기
AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(SameBeanConfig.class);
SameBeanConfig에 타입이 MemberRepository인 것 2개 만들기
@Configuration
static class SameBeanConfig {
@Bean
public MemberRepository memberRepository1() {
return new MemoryMemberRepository();
}
@Bean
public MemberRepository memberRepository2() {
return new MemoryMemberRepository();
}
}
타입으로 조회 시 같은 타입이 둘 이상있으면, 중복 오류 발생
이대로 실행하면 아래 캡쳐사진처럼 NoUniqueBeanDefinitionException 에러(빈이 unique하지 않다)가 뜬다.
📌 ac.getBean(MemberRepository.class);
MemberRepository.class 타입인 빈을 조회하겠다. 그럼 2개가 조회된다.
@Test
@DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다")
void findBeanByTypeDuplicate() {
ac.getBean(MemberRepository.class);
}
오류를 반영하여 테스트 코드 수정해준다..
📌 assertThrows(NoUniqueBeanDefinitionException.class, () → ac.getBean(MemberRepository.class));
ac.getBean(MemberRepository.class를 실행했을 때, NoUniqueBeanDefinitionException 오류가 떠야 테스트 성공
@Test
@DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다")
void findBeanByTypeDuplicate() {
assertThrows(NoUniqueBeanDefinitionException.class,
() -> ac.getBean(MemberRepository.class));
}
타입으로 빈을 조회하는게 아니라, 빈 이름을 조회하면 해결
"memberRepository1"을 추가해줬음..
@Test
@DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다")
void findBeanByName() {
MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}
동일한 타입을 모두 조회하고 싶다면?
특정 타입 모두 조회하기
📌 Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
📌 for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + ", value = " + beansOfType.get(key));
}
MemberRepository.class 타입의 빈을 조회 → Map으로 나옴 = <메소드 이름, 주소 값>
📌 System.out.println("beansOfType = " + beansOfType);
📌 assertThat(beansOfType.size()).isEqualTo(2);
빈이 2개인지
@Test
@DisplayName("특정 타입을 모두 조회하기")
void findAllBeanByType() {
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + ", value = " + beansOfType.get(key));
}
System.out.println("beansOfType = " + beansOfType);
assertThat(beansOfType.size()).isEqualTo(2); // 빈이 2개인지
}
'공부 > Spring' 카테고리의 다른 글
[Spring] Beanfactory와 ApplicationContext (0) | 2023.11.07 |
---|---|
[Spring] 스프링 빈 조회 - 상속 관계 (0) | 2023.11.07 |
[Spring] 스프링 빈 조회 - 기본 (0) | 2023.11.06 |
[Spring] 스프링으로 전환하기 (0) | 2023.11.01 |
[Spring] IoC, DI, 컨테이너 (2) | 2023.10.04 |