-
스프링 빈 조회 - 동일한 타입이 둘 이상FrameWork/Spring&Spring-boot 2022. 1. 1. 14:35
- 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면오류가 발생한다. 이때는 빈 이름을 지정하자
- 'ac.getBeansOfType( )'을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.
@Configuration static class SameBeanConfig{ }
-> class안에서 class를 사용했다는 것은 scope을 class로 제한하겠다는것.
@Configuration static class SameBeanConfig{ @Bean public MemberRepository memberRepository1(){ return new MemoryMemberRepository(); } @Bean public MemberRepository memberRepository2(){ return new MemoryMemberRepository(); } }
-> 성능,기능이 다를 경우 같은 'MemoryMemberRepository' 빈을 여러개 생성 할 수 도 있다.
예)다른 파라미터를 넣어서 Bean을 생성할 수도 있다.
그래서, Bean의 이름이 다르고, 구현체가 되는 인스터스(class) type이 충분히 다를 수 있다.
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
->스프링 컨테이너가 뜰때 'SameBeanConfig'만 가지고 실행을 하는 것이다.
@Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.") void findBeanByTypeDuplicate(){ ac.getBean(MemberRepository.class); }
↓↓↓↓
'NoUniqueBeanDefinitionException'
@Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.") void findBeanByTypeDuplicate(){ assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class)); }
@Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다.") void findBeanByName(){ MemberRepository memberRepository = ac.getBean("memberRepository1",MemberRepository.class); assertThat(memberRepository).isInstanceOf(MemberRepository.class); }
@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); }
map.keySet( )
-> 해당 map에 있는 key이름을 출력(순서는 랜덤이다.)
[출처 : 김영한. 스프링 핵심 원리-기본편. 인프런]
'FrameWork > Spring&Spring-boot' 카테고리의 다른 글
BeanFactory와 ApplicationContext (0) 2022.01.09 스프링 빈 조회-상속관계 (0) 2022.01.02 스프링 빈 조회 - 기본☆ (0) 2022.01.01 컨테이너에 등록된 모든 빈 조회 (0) 2022.01.01 스프링 컨테이너와 스프링 빈 (0) 2022.01.01