쌓고 쌓다

스프링 빈 조회 - 동일 타입, 상속 관계 본문

프로그래밍/spring

스프링 빈 조회 - 동일 타입, 상속 관계

승민아 2023. 7. 9. 16:47

동일 타입 조회

먼저 스프링 빈 설정 정보를 보자.

 

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);

 

Comments