DI 컨테이너인 스프링 컨테이너가 생성되는 과정과 컨테이너에 등록되는 객체인 스프링 빈을 조회하는 방법에 대해 알아보겠습니다.
스프링 컨테이너가 생성되는 과정
스프링 컨테이너 생성

- ApplicationContext 를 스프링 컨테이너라 합니다.
- ApplicationContext 는 인터페이스입니다.
- XML 기반 , 애노테이션 기반 생성 가능
- AnnotationConfigApplicationContext (구현체)
- 더 정확히는 BeanFactory, ApplicationContext 로 구분합니다.
스프링 빈 등록

- 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록합니다.
- 빈 이름
- 빈 이름은 메서드 이름을 사용한다.
- 빈 이름을 직접 부여할 수도 있다.
- @Bean(name=”orderService2”)
- 빈 이름은 항상 다른 이름을 부여해야합니다. 같은 이름을 부여하면 다른 빈이 무시되거나, 기존 빈을 덮어버리거나 설정에 따라 오류가 발생합니다!
스프링 빈 의존관계 설정 준비

스프링 빈 의존관계 설정 완료

- 위의 이미지는 빈들간의 의존관계입니다.
- 현재 AppConfig 는 UserRepository를 DI 받아 사용하기 때문에 저렇게 표현해주었습니다.
- @Configuration엔 @Component가 붙어있어 AppConfig 또한 스프링 빈입니다.
- 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI) 합니다.
- 단순히 자바 코드를 호출하는 것 같지만, 차이가 있습니다.
- 싱글톤 컨테이너라는 점 입니다(Proxy, CGLIB).
이렇듯 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있습니다.
하지만 모든 빈을 생성하고 그 다음에 의존관계를 주입하는 것이 아니고, 생성자 주입의 경우 생성자를 통해 빈을 생성하면서 의존관계 주입이 한번에 처리되는 형태입니다.
컨테이너에 등록된 모든 빈 조회
- 모든 빈 조회하기
- ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회
- ac.getBean() : 빈 이름으로 빈 객체를 조회
- 애플리케이션 빈 조회하기
- BeanDefinition.getRole()
- ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
- ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
스프링 빈 조회 - 기본
- ac.getBean(빈이름, 타입)
- ac.getBean(타입)
- 조회 대상 스프링 빈이 없으면 예외 발생
- NuSuchBeanDefinitionException
스프링 빈 조회 - 동일한 타입이 둘 이상
- 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다. 이때는 빈 이름을 지정해야 합니다.
- ac.getBeanOfType() 을 사용하면 해당 타입의 모든 빈을 조회할 수 있습니다.
스프링 빈 조회 - 상속관계
- 부모 타입으로 조회하면, 자식 타입도 함께 조회합니다.
- Object 타입으로 조회하면 모든 스프링 빈을 조회할 수 있습니다.
Reference.