코드 그라데이션

스프링 빈 조회 (2) 상속 관계 본문

Spring/핵심 원리 구현

스프링 빈 조회 (2) 상속 관계

완벽한 장면 2024. 1. 22. 23:03

스프링 빈 조회 - 상속 관계

  • 부모 타입으로 조회하면, 자식 타입도 함께 조회한다.
  • 그래서 모든 자바 객체의 최고 부모인 `Object` 타입으로 조회하면, 모든 스프링 빈을 조회한다.

 

 

 

먼저

static 클래스 등록

// static 클래스 추가하여 빈 두 개 등록
@Configuration
static class TestConfig {
    @Bean
    public DiscountPolicy rateDiscountPolicy() {
        return new RateDiscountPolicy();
    }
    @Bean
    public DiscountPolicy fixDiscountPolicy() {
        return new FixDiscountPolicy();
    }
}

 

 

첫 번째 메서드

    @Test
    @DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 중복 오류가 발생한다")
    void findBeanByParentTypeDuplicate() {
//      DiscountPolicy bean = ac.getBean(DiscountPolicy.class); => 둘 다 찾으려 함. 오류나옴.
//      NoUniqueBeanDefinitionException

        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); // Map으로 나온다는 것
    assertThat(beansOfType.size()).isEqualTo(2); // expected라고 주석이 나옴. 두개니까.

    // 공부용 출력문 - 개발상에서는 빼자.
    for (String key : beansOfType.keySet()) {
        System.out.println("key = " + key + " value=" + beansOfType.get(key));
    }
}

 

출력 결과

 

 

다섯번째 메서드

@Test
@DisplayName("부모 타입으로 모두 조회하기 - Object")
void findAllBeanByObjectType() {
    Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);

    for (String key : beansOfType.keySet()) {
        System.out.println("key = " + key + " value=" + beansOfType.get(key));
    }

}

 

출력 결과

이렇게 엄청나게 많이 나옴

 


우리가 개발하면서 ApplicationContext에서 직접 게팅할 필요는 아예 없다. 또는 매우 드물다.
스프링 컨테이너가 자동으로 의존관계 주입하는 걸 쓰거나 @Bean 쓰는 등의 방법을 사용한다.
실제 개발할 때 ApplicationContext에서 빈을 조회할 일도 매우 드물다.

 

728x90
Comments