Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

스프링 빈 조회 - 같은 타입의 빈이 여러 개면? 본문

인프런/[인프런] Spring 핵심원리 이해

스프링 빈 조회 - 같은 타입의 빈이 여러 개면?

Seung__ 2021. 7. 26. 21:11

1. 클래스로 빈을 찾았는데 같은 타입의 빈이 여러개면???


  • 이름을 지정해주면 된다 ㅋㅋ
  • as.getBeansOfType()사용하면 해당 타입의 모든 빈 조회가능
  • 중복상황을 만들어 주기 위해 내부 클래스에 SameBeanConfig를 만들어주었다.
  • 만약 클래스로 찾았는데 중복된다면 NoUniqueDefinitionException이 발생한다.
public class ApplicationContextSameBeanFindTest {

    AnnotationConfigApplicationContext ac =  new AnnotationConfigApplicationContext(SameBeanConfig.class);

    @Test
    @DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 중복 오류가 발생")
    void findBeanByTypeDuplicate(){
        MemberRepository bean = ac.getBean(MemberRepository.class);
    }


    @Configuration
    static class SameBeanConfig{
        @Bean
        public MemberRepository memberRepository(){
            return new MemoryMemberRepository();
        }

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

    }

}

  • 중복 발생 시 해당 예외가 터지는지 검증하도록 변경
 @Test
    @DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 중복 오류가 발생")
    void findBeanByTypeDuplicate(){
        //MemberRepository bean = ac.getBean(MemberRepository.class);
        assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class));
    }

 

2. 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다!


  • ac.getBean(빈 이름, 타입)
  @Test
    @DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다.")
    void findBeanByName(){
        MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class);
        assertThat(memberRepository).isInstanceOf(MemberRepository.class);
    }

 

3. 특정 타입 모두 조회하기


  • ac.getBeansOfType()을 사용하면 된다.
  • return 타입은 Map<String, class>로 key & Value 형식이다. 
    key = 빈 이름, value = 빈 객체
   @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("beansOfType = " + beansOfType);
        assertThat(beansOfType.size()).isEqualTo(2);
    }
  • 실행 결과
key = memberRepository value = hello.core.member.MemoryMemberRepository@6622fc65
key = memberRepository2 value = hello.core.member.MemoryMemberRepository@299321e2
beansOfType = {memberRepository=hello.core.member.MemoryMemberRepository@6622fc65, memberRepository2=hello.core.member.MemoryMemberRepository@299321e2}

 

 

4. GitHub : 210726 Find Bean


 

 

GitHub - bsh6463/SpringCoreFunction

Contribute to bsh6463/SpringCoreFunction development by creating an account on GitHub.

github.com

 

Comments