스프링 빈 조회
// 빈 조회
public 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());
}
}
이름 제외하고 타입만 조회할때
@Test
@DisplayName("이름 없이 타입으로 조회")
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class); //타입만 매개변수에
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class); //isInstanceOf 어떤 객체 인스턴스야?
}
만약 동일한 타입이 둘 이상일때 NoUniqueBeanDefinitionException 중복 오류가 난다.
public class SameBeanConfig {
//타입 중복
@Bean
public MemberService memberService1() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberService memberService2() {
return new MemberServiceImpl(memberRepository());
}
}
이럴땐 빈 이름을 같이 적어주기!
MemberService memberService = ac.getBean("memberService2", MemberService.class);
구체 타입으로 조회
@Test
@DisplayName("구체 타입으로 조회")
void findBeanByName2() {
MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class); //isInstanceOf 어떤 객체 인스턴스야?
}
MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class);
인터페이스명이 아니라 구현한 클래스명으로 한다
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository()); // 구현체
}
...
}
하지만 구현에 의존한 거라 유연성이 떨어져서 좋지 않음 (되도록이면 역할에 의존하도록 해야 좋은 코드!)
예외 테스트 해보기
없는 빈 이름으로 조회시 예외가 터져야하는 테스트
@Test
@DisplayName("빈 이름으로 조회 X")
void findBeanByNameX() {
MemberService XXX= ac.getBean("XXX", MemberService.class); //없는 빈 이름
// assertThrows(무조건 예외가 터져야한다, 람다식~)
org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("XXX", MemberService.class));
}
NoSuchBeanDefinitionException : 빈이름이 찾을 수 없다는 에러
* Assertions는 junit으로 쓴다.
반응형
LIST
'공부' 카테고리의 다른 글
Spring | BeanFactory , ApplicationContext , 스프링의 다양한 설정 형식 (자바코드, XML) (0) | 2023.11.28 |
---|---|
Spring | 스프링 빈 조회 - 상속 관계 (1) | 2023.11.23 |
Spring | 스프링으로 전환하기, 스프링 컨테이너 생성, 생성한 빈 출력 테스트 (0) | 2023.11.22 |
IoC, DI 컨테이너 (0) | 2023.11.21 |
Spring boot | 스프링 부트 프로젝트 생성 (1) | 2023.11.20 |