TIL

183일차(모험 92일차) - 스프링 빈 조회 - 상속 관계

haedal-uni 2022. 3. 16. 20:44
728x90

[add] 스프링 빈 조회 - 상속 관계 [#13] #18

부모 타입으로 조회하면, 자식 타입도 함께 조회한다.

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

 

 

public class ApplicationContextSameBeanFindTest { }

위 클래스도 눈에 안보이지만 사실은 아래 코드와 같다.

public class ApplicationContextSameBeanFindTest extends Object { }

 

눈에 안보이면 자동으로 Object 코드가 들어간다고 보면 된다. 

 


 

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 타입으로 조회하면

자식 타입인 RateDiscountPolicy와 FixDiscountPolicy가 조회가 된다.

 


Test 만들어보기

부모 타입으로 조회 시, 자식이 둘 이상 있으면, 중복 오류가 발생한다.

assertThrows(NoUniqueBeanDefinitionException.class,
            () -> ac.getBean(DiscountPolicy.class));

* import static org.junit.jupiter.api.Assertions.assertThrows;

 

 

 

 

부모 타입으로 조회 시, 자식이 둘 이상 있으면, 빈 이름을 지정하면 된다.

DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);

* import static org.assertj.core.api.Assertions.assertThat;

 

타입은 DiscountPolicy 이지만 실제 구현 객체는 RateDiscountPolicy가 나온다.

 

 

 

 

특정 하위 타입으로 조회

* 추천하지 않는 방법이다.

RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
assertThat(bean).isInstanceOf(RateDiscountPolicy.class);

타입을 바로 지정한다. 하나 밖에 없으므로 

구체적인 타입을 지정하면 현재 하나 밖에 없으므로 바로 나오게 된다.

 

 

 


@Configuration
static class TestConfig {
    @Bean
    public DiscountPolicy rateDiscountPolicy() {
        return new RateDiscountPolicy();
    }

    @Bean
    public DiscountPolicy fixDiscountPolicy() {
        return new FixDiscountPolicy();
    }
}

에서 DiscountPolicy 대신 RateDiscountPolicy로 지정해도 똑같다. 

그런데 DiscountPolicy로 해놓는 이유는 이 전에 역할과 구현을 쪼개는 것과 같다.

DiscountPolicy를 보고 역할을 보는 것이다.

 


 

부모 타입으로 모두 조회하기 - Object

내부적으로 쓰는 bean 까지 모두 출력된다.

자바 객체는 전부 object type이기 때문에 스프링 빈에 등록된 모든 겍체가 출력되는 것이다.

 

 

* 실제 Application Context에서 bean을 조회할 일은 거의 없다.

부모타입으로 조회할 때 자식이 어디까지 조회가 되는지 정도는 알고 있어야 

나중에 자동의존관계 주입에서 문제없이 해결할 수 있기 때문이다. 

 

728x90