Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

스프링 빈 조회 - 상속관계 본문

인프런/[인프런] Spring 핵심원리 이해

스프링 빈 조회 - 상속관계

Seung__ 2021. 7. 26. 21:46
  • 원칙 : 부모 타입으로 조회하면, 자식 타입은 줄줄이 끌려나옴.
  • 그러면 Object로 조회하면 전부 다 조회하겠네?

1. TestConfig class생성


  • 해당 테스트에서 사용할 Configuration class
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();
        }
    }

}

 

2. 부모 타입으로 조회


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

3. 부모타입으로 조회


  • 예외가 안터질라면?
  • 이름을 지정하면됨!
 @Test
    @DisplayName("부모 타입으로 조회시 , 자식이 둘 이상 있으면, 빈 이름을 지정")
    void findBeanByParentTypeBeanName(){
        DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy",DiscountPolicy.class);
        assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
    }

 

4. 특정 하위 타입으로 조회( 구체 클래스 조회)


  • 구체 클래스도 조회가 가능해
  • 좋은 방법은 아니야. 역할에 의존해야함.
  • 가끔 필요할 경우는 있음.
  @Test
    @DisplayName("특정 하위타입으로 조회 = 구체 클래스 조회")
    void findBeanBySubType(){
        DiscountPolicy rateDiscountPolicy = ac.getBean(RateDiscountPolicy.class);
        assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
    }

 

 

5. 부모 타입으로 모두 조회


  • ac.getBeansOfType(type) 사용
  • 자식 클래스까지 다꺼내옴
@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));
        }
    }

key = rateDiscountPolicy value = hello.core.discount.RateDiscountPolicy@1ae67cad
key = fixDiscountPolicy value = hello.core.discount.FixDiscountPolicy@2f6e28bc

 

6. Object로 조회하면?


  • 모든 스프링 빈 다끌려옴
  @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));
        }
    }

다 끌려나온다 ㄷㄷㄷ

 

7. GitHub : 210726 Find Bean


 

 

GitHub - bsh6463/SpringCoreFunction

Contribute to bsh6463/SpringCoreFunction development by creating an account on GitHub.

github.com

 

Comments