스프링 빈 타입 조회 중복

jaepani5015·2021년 4월 20일
0

Spring 공부 정리

목록 보기
2/10

스프링 빈 조회 방법

우선 스프링 빈 조회 방법에 대해서 알아보면

ApplicationContext ac = new AnnotationApplicationContext(AppConfig.class);

라고 컨테이너를 생성하고, 빈을 등록했다면
ac.getBean()메서드를 사용해서 빈을 조회한다.
그리고 메서드의 인자 값으로
ac.getBean(타입) 또는 ac.getBean(빈이름, 타입)으로 조회한다.

스프링 빈 타입 조회 - 동일한 타입이 둘 이상

스프링 빈 타입조회시 동일한 타입이 둘 이상이라면 NoUniqueBeanDefinitionException에러가 발생한다.

스프링 빈 중복 타입 조회 코드

ApplicationContext ac = new AnnotationConfigApplicationContext(SameBean.class);

@Test
@DisplayName("빈 타입 조회시 중복되는 경우 에러 발생")
void findBeanError() {
    MemberRepository bean = ac.getBean(MemberRepository.class);
    System.out.println("bean = " + bean);
}

static class SameBean {

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public MemberRepository memberRepository2() {
        return new MemoryMemberRepository();
    }
}

스프링 빈 중복 타입 조회 코드 결과

해결 방법

해결방법은 타입과 더불어 빈 이름을 같이 지정해주도록 한다.

스프링 빈 조회 타입 + 빈 이름 코드

ApplicationContext ac = new AnnotationConfigApplicationContext(SameBean.class);

@Test
void sameBeanInsertBeanName() {
    MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class);
    System.out.println("memberRepository = " + memberRepository);
}

동일한 타입의 빈 전체 조회방법

만약 빈을 조회하는데 동일한 모든 빈을 조회하는 경우 ac.getBeansOfType()메서드를 사용한다.

동일한 타입 빈 전체 조회 코드

ApplicationContext ac = new AnnotationConfigApplicationContext(SameBean.class);

@Test
void findAllBeans() {
    Map<String, MemberRepository> beans = ac.getBeansOfType(MemberRepository.class);
    for (String key : beans.keySet()) {
        System.out.println("key = " + key + " value = " + beans.get(key));
    }
    System.out.println("beans = " + beans);
}

동일한 타입 빈 전체 조회 결과

key = memberRepository value = hello.core.member.MemoryMemberRepository@1c33c17b
key = memberRepository2 value = hello.core.member.MemoryMemberRepository@5bf0fe62
beans = {memberRepository=hello.core.member.MemoryMemberRepository@1c33c17b, memberRepository2=hello.core.member.MemoryMemberRepository@5bf0fe62}

참고

READ

2021.04.20 - 첫 내용 작성

profile
LOVE JEJU🏝 :: 백엔드 개발자로 성장중... 💻

관심 있을 만한 포스트

0개의 댓글