Spring/기초

[Spring] 중요!! 스프링 빈 등록 및 조회 - 상속관계

여행하는 개발자(SOO) 2022. 4. 5. 20:10
728x90
  • 부모 타입으로 조회하면, 자식 타입도 함께 조회된다.
  • 모든 자바 객체의 최고 부모인 Object타입으로 조회하면, 모든 스프링 빈을 조회한다.

자료출처 - 인프런 김영한의 스프링 핵심원리 기본편

부모 타입 조회시 자식이 둘 이상인 경우


  • DiscountPolicy 타입으로 rateDiscountPolicy() 와 fixDiscountPolicy() 두개의 @Bean이 있다.
  • 이로 인해서 스프링 컨테이너는 어떤 DiscountPolicy를 불러와야 할지 혼동되기 때문에 NoUniqueBeanDefinitionException 에러를 발생시킨다.
    @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);
        assertThrows(NoUniqueBeanDefinitionException.class,
                () -> ac.getBean(DiscountPolicy.class));
    }

해결방법


  • 해결방법은 간단하다, 빈의 이름을 타입과 함께 적어주면 된다.
    @Test
    @DisplayName("부모 타입으로 조회, 자식이 둘 이상 있으면, 이름을 지정하면 된다")
    void findBeanByParentTypeBeanName() {
        DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
        assertThat(rateDiscountPolicy).isInstanceOf(DiscountPolicy.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));
        }
    }
728x90