ApplicationContext는 스프링 컨테이너이고, 인터페이스이다. 스프링 컨테이너를 생성할 때는 구성 정보(AppConfig.class)를 지정해줘야 한다.
ApplicationContext applicationContext = new AnnotationConfigContext(AppConfig.class);
빈 이름은 항상 다른 이름으로 부여해야 한다. 다른 빈이 무시되거나 덮어버리는 오류가 발생한다.
스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입한다.
Role ROLE_APPLICATION: 직접 등록한 애플리케이션 빈
Role ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈
public class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("Print Application Bean")
public void findApplicationBean() throws Exception{
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole()==BeanDefinition.ROLE_APPLICATION){//내가 애플리케이션을 위해서 제작한 빈
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = "+beanDefinitionName+" object = "+bean);
}
}
}
}
인스턴스타입을 보고 조회하기 때문에 MemberServiceImpl로도 조회가 가능하다. 하지만 이는 구현에 의존하기 떄문에 좋은 방식은 아니다.
class ApplicationContextBasicFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("빈 이름으로 조회")
public void findBeanByName() throws Exception {
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("이름 없이 타입으로만 조회")
public void findBeanByType() throws Exception {
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("구체 타입으로 조회")
public void findBeanByType2() throws Exception {
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("빈 이름으로 조회X")
public void findBeanByNameX() throws Exception {
// ac.getBean("xxxxx",MemberService.class);
assertThrows(NoSuchBeanDefinitionException.class,()->
ac.getBean("xxxxx",MemberService.class));//예외가 터지면 성공
}
}