ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 빈 조회 - 동일한 타입이 둘 이상
    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이름을 출력(순서는 랜덤이다.)

     

    [출처 : 김영한. 스프링 핵심 원리-기본편. 인프런]

     

    댓글

Designed by Tistory.