스프링 빈 조회 - 타입, 상속관계

이연희·2022년 7월 5일
0

Spring

목록 보기
62/105

스프링 빈 조회

같은 타입의 2개 이상의 빈 존재

테스트 안에서 Config 클래스 생성 후 등록

public class ApplicationContextSameBeanFindTest {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
	@Configuration
    static class SameBeanConfig {
        @Bean
        public MemberRepository memberRepository1() {
            return new MemoryMemberRepository();
        }

        @Bean
        public MemberRepository memberRepository2() {
            return new MemoryMemberRepository();
        }
    }
}

타입으로 조회시 같은 타입이 둘 이상 있으면 NoUniqueBeanDefinitionException

@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.")
public void findBeanByTypeDuplicate() throws Exception{
    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);
}

상속관계

부모 타입으로 조회하면 자식 타입도 함께 조회된다. 자바 객체의 root인 Object 타입으로 조회하면 모든 스프링 빈을 조회한다.
@Bean의 타입을 RateDiscountPolicy가 아닌 DiscountPolicy로 설정한 이유는 역할과 구현을 구분하기 위해서다. 의존관계 주입시에도 DiscountPolicy를 보고 주입할 수 있기 때문이다.

public class ApplicationContextExtendsFindTest {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
    @Configuration
    static class TestConfig {
        @Bean
        public DiscountPolicy rateDiscountPolicy() {
            return new RateDiscountPolicy();
        }

        @Bean
        public DiscountPolicy fixDiscountPolicy() {
            return new FixDiscountPolicy();
        }
    }
}
@Test
@DisplayName("부모 타입으로 조회시 자식이 둘 이상 있으면 중복 오류가 발생")
void findBeanByParentTypeDuplicate(){
	assertThrows(NoUniqueBeanDefinitionException.class,
    () -> ac.getBean(DiscountPolicy.class));
}

@Test
@DisplayName("부모 타입으로 조회시 자식이 둘 이상 있으면 빈 이름을 지정하면 된다.")
void findBeanByParentTypeBeanName(){
    DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
    assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
}

@Test
@DisplayName("특정 하위 타입으로 조회")
void findBeanBySubType(){
    RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
    assertThat(bean).isInstanceOf(RateDiscountPolicy.class);
}

@Test
@DisplayName("부모 타입으로 모두 조회하기")
void findAllBeanByParentType() {
    Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
    assertThat(beansOfType.size()).isEqualTo(2);
    for (String key : beansOfType.keySet()) {
        System.out.println("key = "+key+" value = "+beansOfType.get(key));
    }
}
profile
공부기록

0개의 댓글