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

타입으로 조회할 때 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다! (NoUniqueBeanDefinitionException)

오류 검출 테스트코드(예외가 터져야 테스트 성공!) Java8 람다식으로 assertThrows(발생하라 에러.class, ()-> 실행할 로직)

@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다")
void findBeanByTypeDuplicate(){
    //MemberRepository bean = ac.getBean(MemberRepository.class);
    //예외 터지는 것이 성공하는 로직이다!
    assertThrows(NoUniqueBeanDefinitionException.class,//발생할 에러
            () -> ac.getBean(MemberRepository.class));//실행되는 로직
}

앞에 빈 이름을 넣어주면 특정 빈을 조회할 수 있다!

void findBeanByName(){
    MemberRepository memberRepository
    = ac.getBean("memberRepository1",MemberRepository.class);
    assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}

AnnotationConfigApplicationContext.getBeansOfType()을 사용하면 해당 타입의 모든 빈을 조회할 수 있다. =>Map(Key, Value) 으로 반환한다!

@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);
}

static class를 사용하는 이유 : 클래스 안에 클래스를 만들 때 static class를 사용한다. 이유는 그 클래스 내부에서만 사용하고자 하기 때문이다!

Last updated