본문 바로가기
Spring

스프링 빈 조회 - 기본 & 동일한 타입이 둘 이상

by 김도유 2022. 11. 7.

스프링 빈 조회 - 기본

스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법

-ac.getBean(빈이름, 타입)

-ac.getBean(타입)

-조회 대상 스프링 빈이 없으면 예외 발생

   NoSuchBeanDefinitionException: No bean named 'xxxxx' available

 

class ApplicationContextBasicFindTest {
     AnnotationConfigApplicationContext ac = 
       new AnnotationConfigApplicationContext(AppConfig.class);
    
    @Test
     @DisplayName("빈 이름으로 조회")
     void findBeanByName() {
       MemberService memberService = ac.getBean("memberService",
         MemberService.class);
       assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
     }
     
     @Test
     @DisplayName("이름 없이 타입만으로 조회")
     void findBeanByType() {
       MemberService memberService = ac.getBean(MemberService.class);
       assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
     }
     
     @Test
     @DisplayName("구체 타입으로 조회")
     void findBeanByName2() {
       MemberServiceImpl memberService = ac.getBean("memberService",
         MemberServiceImpl.class);
       assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
     }
     
     @Test
     @DisplayName("빈 이름으로 조회X")
     void findBeanByNameX() {
       //ac.getBean("xxxxx", MemberService.class);
       Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
         ac.getBean("xxxxx", MemberService.class));
     }
}

참고: 구체 타입으로 조회하면 변경시 유연성이 떨어진다.

 

스프링 빈 조회 - 동일한 타입이 둘 이상

-타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다. 이때는 빈 이름을 지정하자. --

-ac.getBeansOfType() 을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.

 

class ApplicationContextSameBeanFindTest {
     AnnotationConfigApplicationContext ac = new
    AnnotationConfigApplicationContext(SameBeanConfig.class);
    
    @Test
     @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다")
     void findBeanByTypeDuplicate() {
       //DiscountPolicy bean = ac.getBean(MemberRepository.class);
       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);
     }
     
     @Configuration
     static class SameBeanConfig {
       @Bean
       public MemberRepository memberRepository1() {
         return new MemoryMemberRepository();
       }
     
       @Bean
       public MemberRepository memberRepository2() {
         return new MemoryMemberRepository();
       }
     }
}

'Spring' 카테고리의 다른 글

어댑터 패턴  (0) 2022.11.15
컨테이너에 등록된 모든 빈 조회  (0) 2022.11.07
스프링 컨테이너 생성  (0) 2022.11.07
객체지향 설계와 스프링  (0) 2022.11.06
회원 관리 예제 - 웹 MVC 개발 1  (0) 2022.11.04

댓글