
실질적으로 Container는 하나만 있고, 그 외에 다양한 IoC, Servlet, Core 등등 다양한 영역으로 Container에 존재한다.
Bean을 담고 있는 박스로 Bean의 라이프 사이클을 관리하며, 생성된 SpringBean들에게 추가적인 기능을 제공하는 역할을 한다. (IoC와 DI의 원리가 SptingContainer에 적용이 된다.)
개발자는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸하지만, 스프링 컨테이너를 사용하면 해당 역할을 대신해 준다. 즉, 제어 흐름을 외부에서 관리하게 된다. 또한, 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 준다.
BeanFactory 는 getBean 메소드 호출시에 bean을 초기화하는데,
applicationfactory 는 스프링 컨테이너 구동시에 초기화한다.
ApplicationContext 는 어노테이션 기반 설정 처리 가능하다. (@Autowired 같은거)
ApplicationContext 는 여러 설정파일 적용 가능하다.
ApplicationContex 는 i18N 처리 가능하다. (다국어 처리)
필요한 의존 객체의 타입에 해당되는 Bean을 찾아 주입한다.
필드(객체의 데이터), 메소드, 생성자 세가지로 주입할 수 있다.
A는 B를 주입 당하겠다고 선언 > A가 실행하려면 B가 필요하다고 SpringBoot가 인식한다.
@Autowired 동작원리 :
@Autowired 어노테이션은 BeanPostProcessor라는 라이프 사이클 인터페이스의 구현체인 AutowiredAnnotationBeanPostProcessor에 의해 의존성 주입이 이루어진다.
특이점 : Bean끼리 서로 의존관계(이것을 설정해주는 역할을 한다.)가 있다. Service가 Controller에게 주입 받는 것처럼 BeanPostProcessor > SpringContext에서 Container에 Bean을 생성하여 넣으려고 한다.
Spring은 객체를 생성하여 Container에 넣는 그 사이에 (인터페이스로) BeanPostProcessor가 존재하는데 이것을 통하여 생성된 (Bean이 될) 객체를 수정하거나 변경할 수 있다.