FrameWork/Spring&Spring-boot
스프링 빈 조회 - 기본☆
Surge100
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
[출처 : 김영한. 스프링 핵심 원리-기본편. 인프런]