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