같은 타입의 스프링 빈이 둘 이상이면 타입으로 조회할 때 오류가 발생한다. 이 때는 빈 이름을 지정해야 한다. 해당 타입의 모든 빈을 조회하려면 ac.getBeansOfType을 사용한다.
publicclassApplicationContextSameBeanTest {AnnotationConfigApplicationContext ac =newAnnotationConfigApplicationContext(SameBeanConfig.class); @Test @DisplayName("타입으로 조회할 때 둘 이상이 있으면 중복 오류가 발생한다.")voidfindBeanByTypeDuplicate() {MemberRepository bean =ac.getBean(MemberRepository.class); }// 테스트용 설정 클래스 @Configuration// static: 클래스 안에 클래스를 만들어 여기서만 쓸 때 사용한다.staticclassSameBeanConfig{ @BeanpublicMemberRepositorymemberRepository1() {// MemoryMemberRepository("10")처럼 다른 파라미터를 넘겨 빈이 생성될 수 있으므로// 이렇게 여러 개로 정의하는 건 틀린 게 아니다.returnnewMemoryMemberRepository(); } @BeanpublicMemberRepositorymemberRepository2() {returnnewMemoryMemberRepository(); } }}
같읕 타입을 반환하는 빈이 두 개면 NoUniqueBeanDefinitionException 예외가 발생한다.
빈 이름을 지정해서 조회
publicclassApplicationContextSameBeanTest { @Test @DisplayName("타입으로 조회할 때 같은 타입이 둘 이상이면 빈 이름을 지정해서 불러온다.")voidfindBeanByName() {MemberRepository memberRepository =ac.getBean("memberRepository1",MemberRepository.class);assertThat(memberRepository).isInstanceOf(MemberRepository.class); }}