해결된 질문
작성
·
117
0
<섹션 4. 스프링 컨테이너와 스프링 빈> 파트에서 질문 드리고 싶은게 있습니다.
저와 비슷한 질문을 하신 분이 있어서 그 게시물에 달린 답변을 읽어보았지만, 여전히 이해가 되지 않습니다...
void findBeanBySubType() {
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();
}
}
컨테이너를 보면 rateDiscountPolicy() 메소드의 리턴 타입은 DiscountPolicy 타입으로 되어있습니다.
따라서, rateDiscountPolicy라는 이름을 가진 빈은, DiscountPolicy 타입의 RateDiscountPolicy 객체를 저장할 것이라고 생각했습니다.
이러한 상황에서 ac.getBean(RateDiscountPolicy.class)
로 빈을 조회하면 RateDiscountPolicy 타입과 그것의 자식 타입 빈이 조회될 것입니다.
저는 ac.getBean(RateDiscountPolicy.class)
이 어떻게 rateDiscountPolicy라는 이름의 빈을 조회할 수 있는지 알고 싶습니다.
해당 빈은 RateDiscountPolicy 객체이지만, 타입은 DiscountPolicy 타입이므로 ac.getBean(RateDiscountPolicy.class)
로 조회했을 때 걸리지 않을 것이라 생각했습니다...
답변 부탁드립니다.
감사합니다!
답변 1
1
안녕하세요. 20011211s님, 공식 서포터즈 David입니다.
기술의 상세한 동작은 브레이크 포인트를 걸어서 한줄 한줄 따라가보는 것이 가장 빠르고 정확하기 때문에 직접 해보시는 것을 권장드립니다.
getBean(Type.class)으로 조회시 내부적으로 빈 이름을 순회하며, 타입과 일치하는 싱글톤 빈을 찾습니다.
메서드 명이 빈 이름으로 등록되고 내부적으로 싱글톤 빈을 저장할 때 빈 이름과 실제 객체가 저장되기 때문에 다음과 같은 상황입니다.
rateDiscountPolicy() => 빈 이름은 rateDiscountPolicy
return new RateDiscountPolicy => 싱글톤 객체는 RateDiscountPolicy 타입
따라서, 빈 이름을 순회하다가 rateDiscountPolicy 이름으로 싱글톤 객체를 가져오면 RateDiscountPolicy 타입일테고, 이는 우리가 요청한 RateDiscountPolicy.class와 일치하기 때문에 반환타입과 별개로 RateDiscountPolicy 타입의 싱글톤 객체를 반환하게 됩니다.
이외 자세한 내용은 아래 코드를 참고해 주세요:)
감사합니다.
답변 감사합니다!
많은 도움이 되었습니다.