스프링 빈 조회
// 빈 조회
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

+ Recent posts