-
스프링 빈과 스프링 컨테이너스프링 2021. 8. 2. 17:34
김영한님의 스프링 핵심 원리 - 기본편 강의를 듣고 작성했습니다.
스프링 컨테이너
스프링 빈이 저장되는 싱글턴 컨테이너를 스프링 컨테이너라고 한다.
- ApplicationContext 클래스를 스프링 컨테이너로써 사용한다.
- 스프링 컨테이너를 사용해서 기존에 AppConfig를 설정하여 객체를 생성하고 DI를 하는 것을 대체 할 수 있다.
- 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정 정보로 사용한다.
- @Bean 어노테이션이 붙은 메소드를 전부 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
- 이렇게 등록된 객체를 스프링 빈이라고 한다.
- 스프링 빈은 @Bean이 붙은 메서드 명을 스프링 빈의 이름으로 사용한다.
- 객체를 조회할떄 AppConfig를 사용해서 직접 조회하는게 아닌 스프링 컨테이너를 통해 객체를 찾을 수 있다. (applicationContext.getBean 활용)
스프링 컨테이너 생성 과정
1. 스프링 컨테이너 생성
- new AnnotationConfigApplicationContexst(AppConfig.class)
- 스프링 컨테이너를 생성할 떄는 구성 정보를 지정해주어야 한다.
- 여기서는 AppConfig.class를 구성 정보로 지정했다.
2. 스프링 빈 등록
- 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다
- 빈 이름은 기본적으로 메소드 이름이 사용되며 애노테이션 속성을 이용해 직접 부여할 수 도 있다.
- ex) @Bean(name="memberService2")
** 빈 이름은 항상 다른 이름을 부여해야 한다. 같은 이름이라면 다른 빈이 무시되거나 기존 빈을 덮어버릴 수 있다.
3. 스프링 빈 의존관계 설정 - 준비
4. 스프링 빈 의존관계 설정 - 완료
* 스프링 컨테이너는 설정 정보를 참고해서 의존 관계를 주입한다.
* 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있다. 하지만 이렇게 자바 코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리하게 된다.
스프링 컨테이너의 여러 메소드들
- applicationContext.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다
- applicationContext.getBean(빈이름, 타입) : 빈 이름으로 빈 객체(인스턴스)를 조회한다.
- applicationContext.getBean(타입)
- * 조회 대상 스프링 빈이 없으면 예외가 발생한다
- 예외 이름) NoSuchBeanDefinitionException: No bean named 'xxxx' available
- beanDefinition.getRole() : 스프링에서 사용하는 빈의 역할 구분
- ROLE_APPLICTION: 일반적으로 사용자가 정의한 빈
- ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
ac.getBeansOfType(빈타입): 같은 타입의 스프링 빈이 둘 이상 있을 때, 해당 타입의 모든 빈을 조회할 수 있다.
상속관계 스프링빈 조회
스프링빈은 부모타입으로 조회하면 자식 타입도 함께 조회한다.
만약 최상의 클래스인 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다.
BeanFactory와 ApplicationContext
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- 스프링 빈을 관리하고 조회하는 역할을 담당한다
- getBean()을 제공한다.
ApplicationContext
- BeanFactory의 기능을 모두 상속받아서 제공한다.
- 빈을 검색, 관리하는 기능을 BeanFactory가 전부 제공하는데 굳이 상속하여 사용하는 이유는 무엇이냐면
- 개발에는 빈의 검색, 관리뿐만 아니라 여러 기능이 필요한데 ApplicationContext 클래스가 여러 클래스들을 상속해 기능들을 제공해준다.
이 기능들에는 다음과 같은 것들이 있다.
- 메시지소스를 활용한 국제화 기능
- 로컬, 개발, 운영등의 상황에 맞게 환경변수 처리
- 애플리케이션 이벤트
- 파일, 클래스패스, 외부등에서 리소스를 편리하게 조회하도록 해주는 기능등을 포함한다.
스프링 빈 메타 정보 - BeanDefinition
스프링은 빈을 설정하는것을 자바파일뿐만 아니라 xml등의 파일로도 설정 할 수 있도록 만들어져있다.
어떻게 다양한 설정 형식을 지원할 수 있을까?
다음 이미지와 같이 역할과 구현을 나눔으로써 다양한 파일 형식을 지원하도록 했다.
* 스프링 컨테이너는 설정 파일이 어떤 언어로 구현되었는지 알 필요 없이 BeanDefinition만 안다면 설정을 읽어들일 수 있다.
- BeanDefinition을 메타정보라고 한다.
- @Bean, <bean>하나당 각각 하나씩 메타 정보가 생성된다.
- BeanDefinition을 직접 생성해 적용시킬수도 있다.
'스프링' 카테고리의 다른 글
컴포넌트 스캔 (0) 2021.09.01 싱글톤 패턴과 싱글톤 컨테이너 (0) 2021.08.28 객체 지향 원리 적용 (0) 2021.07.29 스프링과 객체지향설계 (0) 2021.07.25 스프링 빈과 의존 관계 (0) 2021.07.16