본문 바로가기
Spring/기본

4. 스프링 컨테이너와 스프링 빈

by wch_t 2023. 8. 3.

1. 스프링 컨테이너 생성

 

1) 개념

 

- ApplicationContext 를 "스프링 컨테이너" 라 한다.

- ApplicationContext 는 인터페이스다.

- 스프링 컨테이너는 XML 기반으로도 (new GenericXmlApplicationContext("appConfig.xml")),

                                 애노테이션 기반의 자바 설정 클래스 (new AnnotationConfigApplicationContext(AppConfig.class))

                                 만들 수 있다.

 

* 정확히는 스프링 컨테이너를 BeanFactory, ApplicationContext로 구분하지만,

BeanFactory를 직접 사용하는 경우는 거의 없으므로 일반적으로 ApplicationContext를 스프링 컨테이너라 한다.

 

 

 

2) 내부 동작

 

- AppConfig.class 를 구성 정보로 활용하여, 스프링 컨테이너를 생성하고, 스프링 빈을 등록한다.

 

- Bean 이름메서드 이름을 사용한다. (직접 부여할 수도 있음 : @Bean (name="..."))

 

 

 

 

 

 

 

2. 컨테이너에 등록된 빈 조회

 

1)  '스프링 빈' 조회 방법

 

- ac.getBean(빈 이름, 타입)

- ac.getBean(타입)

    → 동일한 타입의 스프링 빈 객체가 여러 개가 있으면, 이름까지 명시해주어야 함

    → 모두 조회하고 싶으면 .getBeansOfType(CLASS TYPE)

 

애플리케이션 빈 출력하기

 

 

 

 

 

 

 

3. 스프링 컨테이너 내부 구조

 

1)  구성 정보, Config의 구현

 

BeanFactory

- 스프링 컨테이너의 최상위 인터페이스

- 스프링 빈을 관리하고 조회하는 역할 => ex. getBean()

 

ApplicationContext

- BeanFactory 기능을 모두 상속받아 제공

- 추가적인 부가 기능... (나중에 공부)

 

ApplicationContext_Impl

- 애노테이션 기반 자바 코드 설정

- XML 기반 설정 

 

 

 

 

2) BeanDefinition Type (역할)

 

> 코드 레벨로 더 들어가면...

(javac : .java → .class     kotlinc : .kt .class 와 비슷..?)

(각각의 컴파일러, Reader가 있다고 생각하고 최종적으로 바이트코드 .class, BeanDefinition을 만드는 흐름)

 

- 스프링 컨테이너는 BeanDefinition (역할) 밖에 모른다.

   애플리케이션의 구성정보가 Annotation 기반 자바 코드인지, XML 기반인지.. (구현) 모른다.

  

 

- 스프링 컨테이너 ApplicationContext의 구현체인 각각의 ...ApplicationContext가 ...Reader를 사용해서

   AppConfig.class / "appConfig.xml" 의 설정 정보를 읽고 BeanDefinition (빈 메타정보) 을 생성한다.

 

BeanDefinition_meta data 출력