[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을 조회할 일은 거의 없다.
부모타입으로 조회할 때 자식이 어디까지 조회가 되는지 정도는 알고 있어야
나중에 자동의존관계 주입에서 문제없이 해결할 수 있기 때문이다.
'TIL' 카테고리의 다른 글
185일차(모험 94일차) - 다양한 설정 형식 지원 - 자바 코드, XML (0) | 2022.03.18 |
---|---|
184일차(모험 93일차) - 정리 + BeanFactory와 ApplicationContext (0) | 2022.03.17 |
182일차(모험 91일차) - 스프링 빈 조회 - 동일한 타입이 둘 이상 (0) | 2022.03.15 |
181일차(모험 90일차) - 스프링 빈 조회 - 기본 (0) | 2022.03.14 |
178일차(모험 87일차) - 스프링 컨테이너 생성 (0) | 2022.03.11 |