스프링 빈 조회 - 기본 [#13] #16
스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법
• ac.getBean(빈이름, 타입)
• ac.getBean(타입)
조회 대상 스프링 빈이 없으면 예외 발생
NoSuchBeanDefinitionException: No bean named 'xxxxx' available
빈 이름으로 조회
한 번 출력시켜보기
@Test
@DisplayName("빈 이름으로 조회")
void findBeanByName() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
System.out.println("memberService = " + memberService);
System.out.println("memberService.getClass() = " + memberService.getClass());
}
이 후 sout 주석
검증하기
@Test
@DisplayName("빈 이름으로 조회")
void findBeanByName() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
// memberService 가 MemberServiceImpl 의 인스턴스인지 검증
}
MemberService memberService = ac.getBean("memberService", MemberService.class);
이름 없이 조회하기
@Test
@DisplayName("이름 없이 타입으로만 조회")
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
// memberService 가 MemberServiceImpl 의 인스턴스인지 검증
}
MemberService memberService = ac.getBean(MemberService.class);
이름을 없앴다.
이렇게 인터페이스로 조회를 했는데 인터페이스로 조회를 하면 인터페이스의 구현체가 대상이 된다.
구체 타입으로 조회
* 같은 타입이 여러 개일 경우 곤란해진다.
@Test
@DisplayName("구체 타입으로 조회")
void findBeanByName2() {
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
// memberService 가 MemberServiceImpl 의 인스턴스인지 검증
}
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
스프링 컨테이너에 객체( MemberServiceImpl ) 가 등록되어있으면 조회가 된다.
스프링 빈에 등록된 인스턴스 타입을 보고 결정하기 때문에 (MemberServiceImpl)
꼭 MemberService처럼 인터페이스가 아니어도 된다.
물론 구체적으로 적는 것은 좋지 않다.
항상 역할과 구현을 구분해야 한다. 그리고 역할에 의존해야 한다.
방금은 구현에 의존했다. 역할에 의존해야하므로 좋은 코드는 아니다.
구체타입으로 조회하면 유연성이 떨어진다.
빈 이름으로 조회 x
org.junit.jupiter.api.Assertions.assertThrows()
alt + enter ⬇️ ( https://lu-delight.tistory.com/469 )
assertThrows(NoSuchBeanDefinitionException.class)
NoSuchBeanDefinitionException : 무조건 예외가 터져야 한다.
예외가 터져야 test 성공
//검증
assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("xxxx", MemberService.class));
assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("xxxx", MemberService.class));
이 로직을 실행하면 예외가 터져야한다.
안터지면 실패!
'TIL' 카테고리의 다른 글
183일차(모험 92일차) - 스프링 빈 조회 - 상속 관계 (0) | 2022.03.16 |
---|---|
182일차(모험 91일차) - 스프링 빈 조회 - 동일한 타입이 둘 이상 (0) | 2022.03.15 |
178일차(모험 87일차) - 스프링 컨테이너 생성 (0) | 2022.03.11 |
177일차(모험 86일차) - error: invalid path (0) | 2022.03.10 |
176일차(모험 85일차) - 스터디 4 (0) | 2022.03.09 |