1- 스프링 빈 조회
- 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생함.
--> 이때는 빈 이름 지정 필요. @Bean (name = "beanName" ) - annotcationConfigApplicationContext.getBeansOfType( )
--> 이를 사용해 해당 타입의 모든 빈 조회 가능
2- 타입으로 조회하는 경우 - 테스트 코드 예시
(1) 테스트시 생성되는 ApplicationContext를 달리하기 위해 해당 코드 내에 Config 클래스를 만듦
(2) 테스트 코드로 실행한 결과 동일 타입의 Bean이 중복으로 조회되어 NoUniueBeanDefinitionException 에러 발생
[ 수정 ]
@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다")
void findBeanByTypeDuplicate() {
// MemberRepository bean = ac.getBean(MemberRepository.class);
assertThrows(NoUniqueBeanDefinitionException.class,
() -> ac.getBean(MemberRepository.class));
}
- 위 사용된 문법은 자바 8의 람다식(Lamda)
- assertThrows로 넘겨준 Exception이 발생하면 테스트 성공
3- 타입으로 조회시 같은 타입이 둘 이상 있을 경우 빈 이름으로 조회 - 테스트 코드 예시
@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다")
void findBeanByName() {
// 단순히 객체 클래스 타입만 넘겨서 조회하면 에러가 발생하였는데, 하기와 같이 멤버 이름을 지정해 받는다면 오류가 발생하지 않음
MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}
4- 특정 타입 모두 조회하기 - 테스트 코드
// 만약 동일 타입의 Bean을 모두 꺼내고 싶은 경우
@Test
@DisplayName("특정 타입을 모두 조회하기")
void findAllBeanByType(){
// 동일 타입들을 모두 갖고 오고 싶다면 getBeansOfType으로 가져오면 됨
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);
}
'Development > Spring Boot' 카테고리의 다른 글
[Spring Boot] Bean factory와 ApplicationContext (중요) (0) | 2022.08.14 |
---|---|
[Spring Boot] 스프링 빈 조회 (4) 상속 관계 (0) | 2022.08.14 |
[Spring Boot] 스프링 컨테이너와 스프링 빈 (2) 컨테이너에 등록된 모든 빈 조회 (0) | 2022.08.13 |
[Spring Boot] 스프링 컨테이너와 스프링 빈 (1) 생성 과정 (0) | 2022.08.13 |
[Spring Boot] 스프링 컨테이너와 스프링 빈 (0) - 이전 강의 중요 포인트 정리 (0) | 2022.08.13 |