스프링 컨테이너와 빈
- 이전 포스팅까지는 개발자가
AppConfig
를 사용해서 직접 조회했지만, 이제는 스프링 컨테이너에서 필요한 스프링 빈(객체)을 찾는다.- 찾는 방법 :
applicationContext.getBean()
메서드 이용
ApplicationContext
: 스프링 컨테이너@Configuration
을 설정(구성) 정보로 사용// 스프링 컨테이너 생성
// 애노테이션 기반의 자바 설정을 하겠다는 코드
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
💡 참고
정확하게는, 스프링 컨테이너를 부를 때는BeanFactory
와ApplicationContext
를 구분해서 이야기한다.
단,BeanFactory
를 직접 사용하는 경우는 거의 없으므로, 일반적으로ApplicationContext
= 스프링 컨테이너라고 이야기한다.
@Bean
이라 적힌 메서드를 모두 호출해서, 반환된 객체를 스프링 컨테이너에 등록한다.@Bean
이 붙은 메서드 명을 스프링 빈의 이름으로 사용@Bean (name="memberService2)"
💡 주의
단, 빈 이름은 항상 다른 이름을 부여해야 한다.
같은 이름을 부여하면, 다른 빈이 무시되거나 기존 빈을 덮어버리거나 등 설정에 따라 오류가 발생한다.
Object
타입으로 조회하면, 모든 스프링 빈이 조회된다.그럼 BeanFactory와 ApplicationContext의 차이점은?
- Application을 개발할 때, 빈을 관리하고 검색해주는 기능 외에도 수많은 부가기능이 필요하다.
💬 요약
BeanFactory
나ApplicationContext
를 스프링 컨테이너라 한다.BeanFactory
를 직접 사용할 일은 거의 없다. 부가기능이 포함된ApplicationContext
를 사용한다.
ApplicationContext
는BeanFactory
의 기능을 상속받는다.ApplicationContext
는 빈 관리기능 + 편리한 부가 기능을 제공한다.
스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있게 유연하게 설계되어 있음
스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까?
->BeanDefinition
이라는 추상화 덕분!
BeanClassName
: 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)factoryBeanName
: 팩토리 역할의 빈을 사용할 경우 이름, 예) appConfigfactoryMethodName
: 빈을 생성할 팩토리 메서드 지정, 예) memberServiceScope
: 싱글톤(기본값)lazyInit
: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연처리 하는지 여부InitMethodName
: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명DestroyMethodName
: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명Constructor arguments
, Properties
: 의존관계 주입에서 사용한다. (자바 설정처럼 팩토리 역할의AnnotationConfigApplicationContext
: AnnotatedBeanDefinitionReader
를 사용해서 AppConfig.class
를 읽고 BeanDefinition
을 생성GenericXmlApplicationContext
: XmlBeanDefinitionReader
를 사용해서 appConfig.xml
설정 정보를 읽고 BeanDefinition
을 생성XxxBeanDefinitionReader
를 만들어서 BeanDefinition
을 생성하면 됨!💬 정리
- BeanDefinition을 직접 생성해서 스프링 컨테이너에 등록할 수도 있다.
(하지만 실무에서 BeanDefinition을 직접 정의하거나 사용할 일은 거의 없다.)- 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다.
(가끔 스프링 코드나 스프링 관련 오픈 소스의 코드를 볼 때, BeanDefinition 이라는 것이 보일 때가 있다. 이때 이러한 메커니즘을 떠올리면 된다.)