쌓고 쌓다
스프링 빈 조회 - 동일 타입, 상속 관계 본문
동일 타입 조회
먼저 스프링 빈 설정 정보를 보자.
SameBeanConfig
@Configuration
public static class SameBeanConfig {
@Bean
public MemberRepository memberRepository1() {
return new MemoryMemberRepository();
}
@Bean
public MemberRepository memberRepository2() {
return new MemoryMemberRepository();
}
}
MemberRepository의 구현체로 MemoryMemberRepository가 있다.
MemberRepository 타입으로 스프링 빈을 조회해보자.
ac.getBean(MemberRepository.class)
=> NoUniqueBeanDefinitionException 에러 발생!
타입으로 조회하면 일치하는 타입이 여러개가 나올 수 있다.
그래서 같은 타입이 여러개라면 빈 이름으로 조회하거나 특정 타입의 빈을 모두 조회하면 된다.
1. 빈 이름 조회
@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상이 있으면, 빈 이름을 지정하면 된다")
public void findBeanByName() {
MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
org.assertj.core.api.Assertions.assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}
2. 특정 타입 빈 모두 조회
@Test
@DisplayName("특정 타입으로 모두 조회하기")
public void findAllBeanByType() {
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for(String key : beansOfType.keySet()) {
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
org.assertj.core.api.Assertions.assertThat(beansOfType.size()).isEqualTo(2);
}
상속 관계 조회
부모 타입을 조회하면 자식 타입도 함께 조회된다.
빈 설정 정보
@Configuration
public static class TestConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
DiscountPolicy의 구현체로 Rate, Fix가 있다.
이때 아래의 코드로 빈 타입 DiscountPolicy 조회하면?
DiscountPolicy bean = ac.getBean(DiscountPolicy.class);
자식 타입인 rateDiscountPolicy와 fixDiscountPolicy 빈이 모두 조회된다.
스프링 빈 조회시 설정 정보의 반환 타입으로 조회하는가? 실제 반환된 값의 타입으로 하는가?
앞전의 설정 정보 반환 타입 DiscountPolicy 따라 DisountPolicy 타입으로 조회하여 나온건가? 아니다.
위의 반환 타입은 Rate, Fix이나 DiscountPolicy로 조회시 두 빈(rateDiscountPolicy,fixDiscountPolicy)이 조회된다.
+ 부모 타입으로 조회시 여러개가 나오는 경우 구체 타입을 지정하여 조회하는 방법도 있다.
DiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
'프로그래밍 > spring' 카테고리의 다른 글
싱글톤 패턴, 싱글톤 컨테이너(스프링 컨테이너) (0) | 2023.07.10 |
---|---|
[스프링 부트] 게시글 댓글 작성 - 9 (0) | 2023.07.10 |
스프링 컨테이너, 스프링 빈 조회 (0) | 2023.07.08 |
IoC, DI, 컨테이너 (0) | 2023.07.07 |
관심사의 분리 with DI? (0) | 2023.07.06 |
Comments