반응형
타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다.
- 이때는 빈 이름을 지정하자.
- ac.getBeansOfType() 을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.
예제코드 (ApplicationContextSameBeanFindTest.java)
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.discount.DiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
public class ApplicationContextSameBeanFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다")
void findBeanByTypeDuplicate() {
// NoUniqueBeanDefinitionException 에러가 발생한다.
// MemberRepository bean = ac.getBean(MemberRepository.class); -> 에러
Assertions.assertThrows(NoUniqueBeanDefinitionException.class,
() -> ac.getBean(MemberRepository.class));
}
@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다")
void findBeanByName() {
MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
org.assertj.core.api.Assertions.assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}
@Test
@DisplayName("특정 타입을 모두 조회하기")
void findAllBeanByType(){
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for (String key : beansOfType.keySet()) {
System.out.println("Key = "+ key + " value = "+ beansOfType.get(key));
}
System.out.println("BeanOfType = "+ beansOfType);
org.assertj.core.api.Assertions.assertThat(beansOfType.size()).isEqualTo(2);
}
@Configuration
static class SameBeanConfig {
@Bean
public MemberRepository memberRepository1() {
return new MemoryMemberRepository();
}
@Bean
public MemberRepository memberRepository2() {
return new MemoryMemberRepository();
}
}
}
반응형
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
27. BeanFactory와 ApplicationContext (0) | 2023.04.17 |
---|---|
26. 스프링 빈 조회 - 상속 관계 (0) | 2023.04.17 |
24. 스프링 빈 조회 - 기본 (0) | 2023.04.02 |
23. 컨테이너에 등록된 모든 빈 조회 (0) | 2023.04.02 |
22. 스프링 컨테이너 생성 | 컨테이너 = 객체들을 담고 있는것 | ApplicationContext = 스프링 컨테이너 (0) | 2023.03.26 |