-
Spring 핵심 원리 기본편 - 4. 스프링 컨테이너와 스프링 빈Spring-Boot/스프링핵심원리 - 기본편 2022. 5. 24. 13:43
*스프링 컨테이너*
- ApplicationContext를 스프링 컨테이너라 한다.
- @Configuration : 애플리케이션의 구성(설정) 정보로 사용
- @Bean : 해당 메서드들을 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록
이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
// 스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); // 스프링 컨테이너에서 빈 가져오기 applicationContext.getBean("memberService", MemberService.class);
- 스프링 컨테이너를 통해서 필요한 스프링 빈( 객체 )를 찾아야한다 .
aplicationContext.getBean( ) 메서드를 사용해서 찾을 수 있다.
- ApplicationContext는 인터페이스다
- 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다.
- 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)한다.
*빈 이름*
- 빈 이름은 메서드 이름을 사용한다.
- 빈 이름을 직접 부여할 수 있다. @Bean(name="memberService2") > 빈 이름은 항상 다른 이름 부여
스프링 컨테이너의 생성과정
1. 스프링 컨테이너 생성
2. 스프링 빈 등록
3. 스프링 빈 의존관계 설정 - 준비
4. 스프링 빈 의존관계 설정 - 완료
스프링 빈 조회
ac.getBean( 빈이름 , 타입 ); ac.getBean( 타입 );
- 조회 대상 스프링 빈이 없으면 예외 발생 : 'NoSuchBeanDefinitionException: No bean named 'xxxx' available'
동일한 타입이 둘 이상
ac.getBeansOfType()
상속관계
- 부모 타입으로 조회하면, 자식 타입도 함께 조회한다.
- 그래서 모든 자바 객체의 최고 부모인 'object' 타입으로 조회하면, 모든 스프링 빈을 조회
- getbean을 사용하여 부모 타입으로 조회 시 , 자식이 둘 이상 있으면, 중복 오류가 발생한다. -> 빈 이름 지정
BeanFactory와 ApplicationContext
- BeanFactory > ApplicationContext > AnnotationConfig, ApplicationContext
* Bean Factory *
- 스프링 컨테이너의 최상위 인터페이스다.
- 스프링 빈을 관리하고 조회하는 역할을 담당
- getBean( ) 을 제공
* ApplicationContext *
- BeanFactory 기능을 모두 상속받아서 제공한다.
- 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다.
- ApplicationContext가 제공하는 부가기능
1. 메세지 소스를 활용한 국제화 기능 - 한국이면 한국어, 영어권이면 영어로 출력
2. 환경 변수 - 로컬, 개발, 운영 등을 구분해서 처리
3. 애플리케이션 이벤트 - 이벤트를 발행하고 구독하는 모델을 편리하게 지원
4. 편리한 리소스 조회 - 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
- BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다.
스프링 빈 설정 메타 정보 - BeanDefinition
- 스프링은 BeanDefinition이라는 추상화로 다양한 설정 형식 지원
- BeanDefinition을 빈 설정 메타 정보라 한다. @Bean당 하나씩 메타정보 생성
- 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성
- BeanDefinition을 직접 생성해서 스프링 컨테이너에 등록할 수 있다. 하지만 실무에서 BeanDefinition을 직접 정의하거나 사용할 일은 거의 없다
스프핑이 빈을 등록하는 방법 중 2가지
1. xml 파일로 직접 스프링 빈을 스프링 컨테이너에 등록
<bean id="" class=""> <constructor-arg name="" ref="" /> </bean>
- class는 존재하지만 factory메서드는 null임
2. factory 메서드를 사용 - java코드 이용
@Configuration public class AppConfig { @Bean public ~ ~() { return ~; } }
- factory메서드는 존재하지만 class가 null임
출처 :
인프런 김영한님의 스프링 핵심 원리 - 기본편
'Spring-Boot > 스프링핵심원리 - 기본편' 카테고리의 다른 글
Spring 핵심 원리 기본편 - 6. 컴포넌트 스캔 (0) 2022.05.30 Spring 핵심 원리 기본편 - 5. 싱글톤 컨테이너 (0) 2022.05.28 Spring 핵심 원리 기본편 - 3. IoC, DI, 그리고 컨테이너 (0) 2022.05.24 Spring 핵심 원리 기본편 - 2. DIP 와 OCP (0) 2022.05.24 Spring 핵심 원리 기본편 - 1. 객체 지향 설계와 스프링 (0) 2022.05.23