스프링 빈 조회 - 상속관계

후하후핳·2022년 3월 9일
0

Spring

목록 보기
6/6
  • 부모 타입으로 조회하면, 자식 타입도 함께 조회
  • 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회

ex) 상속 관계를 테스트하기 위한 테스트 코드

예제1

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

테스트하기 위해서 DiscountPolicy를 부모로 가지고 있는 빈 두개를 생성 한다.

ApplicationContextExtendsFindTest 클래스 안에 테스트 코드를 작성한다.
예제2

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

DiscountPolicy의 자식이 둘이기 때문에 NoUniqueBeanDefinitionException 예외 발생

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

ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
rateDiscountPolicy 이름을 지정해서 원하는 빈을 꺼내면 된다.

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

실제 테스트 코드를 작성할때는 출력은 X

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

모든 자바의 최고 부모 객체는 Object이다.

0개의 댓글

관련 채용 정보