스프링 컨테이너와 스프링 빈
스프링 컨테이너 생성
//스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
- ApplicationContext
- 스프링 컨테이너라고 함
- 인터페이스임
- XML 또는 애노테이션 기반의 자바 설정 클래스로 만들 수 있음
- 스프링 컨테이너 생성 과정
- 스프링 컨테이너 생성
- 스프링 빈 등록
- 빈 이름은 메서드 이름을 사용
- 빈 이름을 직접 부여 가능
- ex) @Bean(name="memberService2")
- 스프링 빈 의존관계 설정 - 준비
- 스프링 빈 의존관계 설정 - 완료
- 스프링 컨테이너는 설정 정보를 참고하여 의존관계를 주입(DI)
- 스프링 컨테이너 생성 과정 그림
컨테이너에 등록된 모든 빈 조회
// 테스트 코드
- 모든 빈 조회
- ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다.
- ac.getBean() : 빈 이름으로 빈 객체(인스턴스)를 조회한다.
- 단축키
- iter + Tab: for 문 자동 완성
- soutm: 메서드명 출력
- soutv: 변수명 출력
스프링 빈 조회 - 기본
- ac.getBean(빈 이름, 타입)
- ac.getBean(타입)
// 테스트 코드
- 단축키
- command + e: 이전 파일로 가기 (최근 파일)
스프링 빈 조회 - 동일 타입 둘 이상
- 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생
- 이때는 빈 이름을 지정하자. ac.getBeansOfType() 을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.
// 테스트 코드
스프링 빈 조회 - 상속 관계
- 부모 타입으로 조회하면, 자식 타입도 함께 조회
BeanFactory 와 ApplicationContext
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- 스프링 빈을 관리하고 조회하는 역할을 담당
- getBean() 을 제공
- 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능
ApplicationContextBeanFactory
- BeanFactory 기능을 모두 상속받아서 제공
- 그 외 수많은 부가 기능 제공
- 메시지 소스를 활용한 국제화 기능
- ex) 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력
- 환경변수
- 로컬, 개발, 운영 등을 구분해서 처리
- 애플리케이션 이벤트
- 이벤트를 발행하고 구독하는 모델을 편리하게 지원
- 편리한 리소스 조회
- 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
정리
- ApplicationContext는 BeanFactory의 기능을 상속 받음
- ApplicationContext는 빈 관리 기능 + 편리한 부가 기능을 제공
- BeanFactory를 직접 사용할 일은 거의 없고 부가기능이 포함된 ApplicationContext를 사용
- BeanFactory나 ApplicationContext를 스프링 컨테이너라고 함
다양한 설정 형식 지원 - 자바 코드, XML
- 애노테이션 기반 자바 코드 설정
- new AnnotationConfigApplicationContext(AppConfig.class)
- XML 설정
- new GenericXmlApplicationContext(AppConfig.xml)
// xml 예제 코드
스프링 빈 설정 메타 정보 - BeanDefinition
- 스프링은 어떻게 다양한 설정 형식을 지원하는 것일까? => 핵심은 BeanDefinition 이라는 추상화!
- 쉽게 이야기해서 역할과 구현을 개념적으로 나눈 것이다!
- XML을 읽어서 BeanDefinition을 만들면 된다.
- 자바 코드를 읽어서 BeanDefinition을 만들면 된다.
- 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다.
- BeanDefinition 을 빈 설정 메타정보라 한다.
- @Bean , <bean> 당 각각 하나씩 메타 정보가 생성된다.
- 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
// 예제 코드
'Spring > [강의] 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[5주차] 싱글톤 컨테이너 (0) | 2021.08.18 |
---|---|
[3주차] 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 (0) | 2021.07.28 |
[1주차] 객체 지향 설계와 스프링 (0) | 2021.07.20 |