티스토리 뷰
스프링 컨테이너의 생성 과정
생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext를 스프링 컨테이너라 함, 이는 인터페이스다.
스프링 빈 등록
스프링 빈 저장소에 @Bean이 붙은 메서드를 이름으로, 객체를 빈 객체로 저장해준다.
빈 이름을 직접 부여 가능하며 -> @Bean( name = " ~ " )
빈 이름은 항상 다른 이름을 부여해야 한다.
이후에 스프링 빈 의존관계 설정을 준비하고 주입해준다.
+) 빈을 알고싶다.
모든 빈 출력하기
applicationContext.getBeanDefinitionNames() -> 스프링에 등록된 모든 빈 이름을 조회
applicationContext.getBean() -> 빈 이름으로 빈 객체를 조회
애플리케이션 빈 출력하기 ( 내가 등록한, getRole을 사용하자 )
beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION -> 사용자 정의 빈
스프링 빈 조회
스프링 빈을 조회하는 방법은 다음과 같다.
1. 빈이름과 타입으로 검색하기
2. 타입으로 검색하기
동일 타입이 둘 이상이라면?
NoUniqueBeanDefinitionException 이 발생한다.
상속 관계에서의 빈 조회
부모를 조회한다면 자식들은 기본적으로 함께 조회된다. (부모 호출 -> 모든 자식 호출)
BeanFactory와 ApplicationContext
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- 스프링 빈을 관리하고 조회하는 역할 담당 ( getBean() )
ApplicationContext
- BeanFacotry 기능을 상속 받아 사용
- MessageSource를 활용한 국제화 기능
- EnviromentCapable 환경변수 - 로컬, 개발, 운영 등을 구분하여 관리
- ApplicationEventPublisher - 이벤트를 발행하고 구독하는 모델을 지운
- ResourceLoader - 편리한 리소스 조회
ApplicationContext는 BeanFactory외에 편리한 부가 기능 사용을 위한 인터페이스를 상속받는다.
다양한 설정 형식 지원 - 자바 코드, XML, Groovy ...
설정 정보를 다양한 형식으로 받아올 수 있는 스프링 컨테이너
스프링 빈 설정 메타 정보 - BeanDefinition
억떡게 스프링은 이렇게 다양한 설정 정보를 지원하는가?
스프링 컨테이너는 어떤 형식의 설정 정보인지 상관하지 않는다. -> BeanDefinition이라는 추상화에만 의존한다.
본 포스팅은 인프런 강의 김영한님의
[ 스프링 핵심 원리 - 기본편 ] 을 수강하며 작성한 내용입니다.