-
스프링 빈 조회 - 기본☆FrameWork/Spring&Spring-boot 2022. 1. 1. 13:01
스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법
- 'ac.getBean('빈이름' , '타입')
- 'ac.getBean(타입)'
- 조회 대상 스프링 빈이 없으면 예외 발생
-'NoSuchBeanDefinition: No bean nasted 'xxxx' avaliable'
package hello.core.beanfind; import hello.core.AppConfig; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; class ApplicationContextBasicFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("빈 이름으로 조회") void findBeanByName(){ MemberService memberService = ac.getBean("memberService", MemberService.class); //System.out.println("memberService = " + memberService); //System.out.println("memberService.getClass() = " + memberService.getClass()); assertThat(memberService).isInstanceOf(MemberServiceImpl.class); } @Test @DisplayName("이름 없이 타입으로만 조회") void findBeanByType(){ MemberService memberService = ac.getBean( MemberService.class); assertThat(memberService).isInstanceOf(MemberServiceImpl.class); } @Test @DisplayName("구체 타입으로 조회") void findBeanByName2(){ MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class); //System.out.println("memberService = " + memberService); //System.out.println("memberService.getClass() = " + memberService.getClass()); assertThat(memberService).isInstanceOf(MemberServiceImpl.class); } @Test @DisplayName("빈 이름으로 조회x") void findBeanByNameX(){ //ac.getBean("xxxx",MemberService.class); assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean("xxxx", MemberService.class)); } }
인터페이스로 조회하면 인터페이스의 구현체가 대상이된다.
@Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); }
-> 스프링빈에 등록된 Instance 타입을 보고 결정이 되기 때문에, 꼭 인테페이스 타입으로 객체를 불러올 필요는 없다.
하지만, 굳이 구제적인 구현체를 type으로 지정할 필요는 없다.(유연성이 떨어진다.)
항상 역할과 구현을 구분하고, 역할(인터페이스)에 의존해야하기 때문이다.
.assertThrows(예외,로직)
assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean("xxxx", MemberService.class));
-> 왼쪽에 로직을 실행하면, 오른쪽의 예외가 터져야한다는 의미
즉. 예외가 발생해야 pass
[출처 : 김영한. 스프링 핵심 원리-기본편. 인프런]
'FrameWork > Spring&Spring-boot' 카테고리의 다른 글
스프링 빈 조회-상속관계 (0) 2022.01.02 스프링 빈 조회 - 동일한 타입이 둘 이상 (0) 2022.01.01 컨테이너에 등록된 모든 빈 조회 (0) 2022.01.01 스프링 컨테이너와 스프링 빈 (0) 2022.01.01 스프링으로 전환하기 (0) 2021.12.31