1) 스프링 컨테이너와 빈의 기본 개요 - ApplicationContext를 스프링 컨테이너라고 한다. - ApplicationContext는 인터페이스다. - 스프링 컨테이너는 XML 기반으로 만들 수 있고, 어노테이션 기반의 자반 설정 클래스로도 만들 수 있다. - 기존에는 개발자가 AppConfig를 사용해서 직접 객체를 생성하고 DI를 했다. - 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정(구성) 정보로 사용 - @Bean 어노테이션이 붙은 메서드를 모두 호출해서 반환된 객체를 모두 스프링 컨테이너에 등록 - 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다. - 스프링 컨테이너를 통해서 필요한 객체(스프링 빈)를 찾아서 사용한다.
2) 스프링 컨테이너 생성 과정 - AppConfig.class 구성 정보를 사용하여 스프링 컨테이너를 생성 - 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용하여 스프린 빈을 등록 - 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)
■ 스프링 빈 조회
1) 상속 관계 - 부모 타입으로 빈을 조회하게 되면, 자식 타입의 스프링 빈까지 함께 조회 - 모든 자바 객체의 최고 부모인 Object 타입으로 스프링 빈을 조회 시, 모든 스프링 빈이 조회
2) BeanFactory - 스프링 컨테이너의 최상위 인터페이스 - 스프링 빈을 관리하고 조회하는 역할을 담당 - getBean() 메서드를 통해 스프링 빈을 조회
3) ApplicationContext - BeanFactory 인터페이스를 상속받아 기능을 확장하여, 빈을 관리하고 조회하는 기능 뿐만 아니라 수 많은 부가 기능을 제공 - 메시지 소스를 활용한 국제화 기능 : 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 애플리케이션의 언어를 출력 - 환경 변수 : 로컬, 개발, 운영 등에서 사용하는 변수를 구분해서 처리 - 애플리케이션 이벤트 : 이벤트를 발행하고 구독하는 모델을 편리하게 지원 - 편리한 리소스 조회 : 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회 4) BeanFactory와 ApplicationContext - ApplicationContext는 BeanFactory의 기능을 상속받는다. - ApplicationContext는 빈 관리 기능 + 편리한 부가 기능을 제공 - 주로 ApplicationContext를 사용 - BeanFactory나 ApplicationContext를 스프링 컨테이너라 지칭 5) 다양한 설정 형식 지원 - 스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있도록 유연하게 설계 - 어노테이션 기반 자바 코드 설정, XML 설정 등을 읽어 스프링 컨테이너에 스프링 빈을 등록 - XML 설정 정보를 스프링 컨테이너 객체에 넘길 때는 GenericXmlApplicationContext를 사용
■ 스프링 빈 설정 메타 정보(BeanDefinition)
1) BeanDefinition - 스프링 컨테이너는 BeanDifinition(빈 설정 메타 정보)를 읽어서 스프린 빈을 생성 - @Bean, <bean> 당 각각 하나씩의 메타 정보를 생성하게 됨 - 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도로만 이해 2) 코드 레벨로 정리 - AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해서 설정 정보가 저장된 AppConfig.class를 읽고 BeanDefinition을 생성 - GenericXmlApplicationContext는 XmlBeanDefinitionReader를 사용해서 설정 정보가 저장된 appConfig.xml을 읽고 BeanDefinition을 생성 - 스프링 컨테이너는 생성된 BeanDefinition을 기반으로 스프링 빈을 생성하게 된다.