스프링 컨테이너와 빈

이연희·2022년 7월 4일
0

Spring

목록 보기
61/105
post-custom-banner

스프링 컨테이너

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);
            }
        }
    }
}

ROLE_APPLICATION 테스트 결과

ROLE_INFRASTRUCTURE 테스트 결과

조회 방식

인스턴스타입을 보고 조회하기 때문에 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));//예외가 터지면 성공
    }
}
profile
공부기록
post-custom-banner

0개의 댓글