스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법을 알아보자.
.getBean()
.getBean(스프링 빈 이름, 타입)과 같은 형식으로 사용되고, 이름을 생략하고 .getBean(타입)으로 사용해도 된다.
만약 조회 대상인 스프링 빈이 존재하지 않는다면 다음과 같은 예외가 발생한다.
NoSuchBeanDefinitionException: No bean named '...' available
실제로 코드를 작성해보자.
먼저, 빈의 이름으로 조회하는 테스트 코드이다.
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.context.annotation.AnnotationConfigApplicationContext;
public class ApplicationContextBasicFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("find Bean by name")
void findBeanByName(){
MemberService memberService = ac.getBean("memberService", MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
}
.getBean() 메서드의 첫 번째 파라미터에 빈의 이름이 들어간 것을 확인할 수 있다.
Assertions... 줄을 보면 memberService가 MemberServiceImpl의 인스턴스이면 테스트가 성공한다는 의미이다.
다음으로, 이름 없이 타입으로만 조회하는 코드를 작성해보자.
...
@Test
@DisplayName("find Bean by type without name")
void findBeanByType(){
MemberService memberService = ac.getBean(MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
...
이 경우 이전의 코드에서 첫 번째 파라미터에 들어가는 빈 이름만 지워주면 된다. 똑같은 결과를 얻을 것이다.
마지막으로, 빈 이름으로 조회가 되지 않는 경우(실패할 경우)를 처리하는 코드를 작성해보자. 이것을 해주지 않으면 실패할 경우 오류가 발생할 것이다.
...
@Test
@DisplayName("fail to find Bean")
void failToFindBean(){
org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("xxxx",MemberService.class ));
}
...
이 코드의 경우, NoSuchBean... 의 오류가 발생해야만 테스트가 성공한다.
'스프링(Spring) > Spring' 카테고리의 다른 글
[Spring] 스프링 빈 조회 - 상속관계 (5) | 2022.08.04 |
---|---|
[Spring] 스프링 빈 조회 - 동일한 타입이 둘 이상인 경우 (0) | 2022.08.01 |
[Spring] 컨테이너에 등록된 모든 빈 조회 (0) | 2022.08.01 |
[Spring] 스프링 컨테이너 생성 (0) | 2022.07.30 |
[Spring] 스프링으로 전환하기 (0) | 2022.07.30 |