ApplicationContext applicationContext
= new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
를 스프링 컨테이너라고 한다.스프링 컨테이너 생성
스프링 빈 등록
스프링 빈 의존 관계 설정
의존 관계 주입은 단순히 자바 코드를 호출하는 것이 아니다. ➡️ 싱글톤 컨테이너
스프링 빈을 등록하면 생성자 호출과 함께 의존 관계 주입도 한 번에 처리된다. ➡️ 의존 관계 주입
스프링 빈은 스프링 IoC 컨테이너에 의해 관리되는 자바 객체(POJO)이다.
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
자바 빈과 스프링 빈은 서로 다른 개념이다.
자바 빈은 DTO, VO 등 특정 형태의 클래스를 가리킨다.private
으로 구성되어getter
/setter
로만 접근할 수 있고, 전달 인자가 없는 생성자를 가지는 클래스이다. 반면 스프링 빈은 스프링 IoC 컨테이너가 관리하는 자바 객체이다.
BeanFactory
의 상속 관계
BeanFactory
⬅️ApplicationContext
⬅️AnnotationConfigApplicationContext
BeanFactory
getBean()
을 제공한다.ApplicationContext
BeanFactory
의 기능을 모두 상속받아 제공한다.ApplicationContext
는 빈 관리 기능에 더해 편리한 부가 기능을 제공한다.스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있도록 설계되어 있다.
애노테이션 기반
ApplicationContext applicationContext
= new AnnotationConfigApplicationContext(AppConfig.class);
new AnnotationConfigApplicationContext(AppConfig.class)
AnnotationConfigApplicationContext
클래스를 사용하면서 자바 코드로 된 설정 정보를 넘기면 된다.XML 기반
GenericXmlApplicationContext
를 사용하면서 xml
설정 파일을 넘기면 된다.스프링은
BeanDefinition
을 추상화하여 다양한 설정 형식을 지원한다.
쉽게 이야기해서 역할과 구현을 개념적으로 나눈 것으로 볼 수 있다.
BeanDefinition
은 빈 설정 메타 정보이다.@Bean
, <bean>
당 각각 하나씩 메타 정보가 생성된다.AnnotationConfigApplicationContext
는 AnnotatedBeanDefinitionReader
를 통해 AppConfig.class
를 읽고, BeanDefinition
을 생성한다.XxxBeanDefinitionReader
를 만들어서 BeanDefinition
을 생성하면 된다.BeanClassName
factoryBeanName
factoryMethodName
Scope
lazyInit
InitMethodName
DestroyMethodName
Constructor arguments
, Properties
BeanDefinition
을 직접 생성해서 스프링 컨테이너에 등록할 수는 있지만, 잘 사용하지는 않는다. 다만 스프링이 다양항 형태의 설정 정보를BeanDefinition
으로 “추상화”한다는 점을 눈여겨 보자.