부모 타입으로 조회하면 자식 타입도 함께 조회한다. 그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면 모든 스프링 빈을 조회한다.
상속 관계가 위와 같다면 1번 타입으로 조회했을 때 모든 빈이 조회된다. 그 다음 번호들도 자기 자식만큼 나온다.
publicclassApplicationContextInheritanceTest {AnnotationConfigApplicationContext ac =newAnnotationConfigApplicationContext(TestConfig.class); @Test @DisplayName("부모 타입으로 조회 시 자식이 둘 이상 있으면 중복 오류가 발생한다.")voidfindBeanByParentTypeDuplicate() {assertThrows(NoUniqueBeanDefinitionException.class, () ->ac.getBean(DiscountPolicy.class)); } @ConfigurationstaticclassTestConfig { @BeanpublicDiscountPolicyrateDiscountPolicy() {returnnewRateDiscountPolicy(); } @BeanpublicDiscountPolicyfixDiscountPolicy() {returnnewFixDiscountPolicy(); } }}
자식이 둘 이상이라면 중복 오류가 발생한다.
참고로 TestConfig의 메서드들은 구체 타입이 아니라 인터페이스를 반환하도록 정의되어 있는데, 물론 구체 타입으로 반환해도 되지만 역할과 구현을 쪼개야 하기 때문에 이렇게 선언한 것이다.
빈 이름으로 지정해서 조회
publicclassApplicationContextInheritanceTest { @Test @DisplayName("부모 타입으로 조회 시 자식이 둘 이상 있으면 빈 이름을 지정해 조회한다.")voidfindBeanByParentTypeBeanName() {DiscountPolicy rateDiscountPolicy =ac.getBean("rateDiscountPolicy",DiscountPolicy.class);assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class); }}