ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext를 스프링 컨테이너라 한다.
ApplicationContext는 인터페이스이다.
컨테이너에 있는 모든 빈을 조회해보자.
class ApplicationContextInfoTest{
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("모든 빈 출력")
void findAllBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for(String beanDefinitionName : beanDefinitionNames){
Object bean = ac.getBean(beanDefinitionName);
}
@Test
@DisplayName("애플리케이션 빈 출력하기")
void findApplicationBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for(String beanDefinitionName : beanDefinitionNames){
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
Object bean = ac.getBean(beanDefinitionName);
}
}
}
* ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름 조회
ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
스프링 빈을 타입으로 조회 시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다.
이를 방지하기 위해 빈 이름을 지정하는 것이 좋다.
모든 자바 객체의 최고 부모 타입인 Object타입으로 스프링 빈을 조회하면, 모든 스프링 빈을 조회한다.
부모 타입으로 조회하면, 자식 타입도 함께 조회한다.
class ApplicationContextExtendsFindTest{
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
@Test
@DisplayName("부모 타입 조회시, 자식이 둘 이상 있으면 중복 오류 발생")
void findBeanByParentTypeDuplicate(){
assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(DiscountPolicy.class));
}
@Test
@DisplayName("부모 타입 조회 시, 자식이 둘 이상 있으면 빈 이름을 지정하자")
void findBeanByParentTypeBeanName(){
DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
}
* BeanFactory vs ApplicationContext
BeanFactory는 스프링 컨테이너의 최상위 인터페이스이다.
스프링 빈을 관리하고 조회, getBean()을 제공한다
사실 우리가 지금까지 활용한 대부분 기능은 BeanFactory가 제공하는 기능이다
ApplicationContext는 BeanFactory 기능을 모두 상속받는다.
그렇다면 둘의 차이는 뭘까. ApplicationContext는 BeanFactory이외의 추가적인 기능을 제공한다.
(환경변수, 이벤트, 리소스 조회, 메세지 소스 활용한 국제화 기능 ..)
보통 그래서 BeanFactory를 직접 사용하는 경우는 거의 없고, 부가기능이 포함된 ApplicationContext를 활용한다.
'스프링 강의 필기 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
섹션 7 - (2). 의존관계 자동 주입 (0) | 2022.07.13 |
---|---|
섹션 7 -(1) 의존관계 자동 주입 (0) | 2022.07.13 |
섹션 6. 컴포넌트 스캔 (0) | 2022.07.13 |
섹션 5 - 싱글톤 컨테이너 (0) | 2022.07.09 |
섹션 3. 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 (0) | 2022.07.09 |