ApplicationContext 는 등록된 Bean 을 가져와 사용할 수 있게 getBean 메소드를 제공합니다. getBean 메소드를 통해 Bean 정보를 방법으로는 객체타입으로 조회하는 방법, 객체타입과 Bean 이름으로 조회하는 방법, 구체 객체타입으로 조회하는 방법이 있습니다.
@Test @DisplayName("빈 이름으로 조회") voidfindBeanByName(){ MemberServicememberService= ac.getBean("memberService", MemberService.class); assertThat(memberService).isInstanceOf(MemberServiceImpl.class); }
@Test @DisplayName("구체 타입으로 조회") voidfindBeanByType2(){ MemberServiceImplmemberService= ac.getBean("memberService", MemberServiceImpl.class); // 구체적으로 적는 것은 별로 않좋다. // 될 수 있는한 추상화한 인터페이스에 테스트를 맞춘다. assertThat(memberService).isInstanceOf(MemberServiceImpl.class); }
같은 타입으로 등록된 빈이 여러개 있을 경우 getBean 을 이용해 Bean 을 가져오게 되면 NoUniqueBeanDefinitionException 에러가 발생하게 됩니다. 이때는 특정 Bean 을 가져올 수 있도록 등록된 Bean 이름 까지 같이 지정해주면 에러를 해결할 수 있습니다.
또한, ApplicationContext 에 특정 타입으로 등록된 모든 Bean 목록을 조회 하고 싶을 경우 ApplicationContext 객체의 getBeansOfType 메소드를 사용하면 됩니다.
같은 타입으로 여러개의 Bean 등록
memberRepository1 와 memberRepository2 가 ApplicationContext 에 MemberRepository 타입 Bean 으로 등록됩니다.
@Configuration staticclassSameBeanConfig { @Bean public MemberRepository memberRepository1() { returnnewMemoryMemberRepository(); }
@Bean public MemberRepository memberRepository2() { returnnewMemoryMemberRepository(); } } }
같은 타입으로 여러개의 Bean 조회
@Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.") voidfindBeanByTypeDuplicate(){ assertThatThrownBy(() ->{ ac.getBean(MemberRepository.class); }).isInstanceOf(NoUniqueBeanDefinitionException.class); }
@Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다.") voidfindBeanByName(){ MemberRepositorymemberRepository= ac.getBean("memberRepository1", MemberRepository.class); assertThat(memberRepository).isEqualTo(MemberRepository.class); }