[Spring] 스프링 컨테이너

[Spring] 스프링 컨테이너

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

ApplicationContext(인터페이스)를 스프링 컨테이너라고 한다.

AppConfig.class 정보(애플리케이션 구성정보)를 ApplicationContext에 넘겨준다.

AppConfig 정보를 기반으로 빈 저장소에 AppConfig에 있는 @Bean을 하나씩 저장한다.

형태는 {빈 이름(메서드 이름):빈 객체(메서드 구현체)} 형태로 저장된다. (이름은 모두 다른 이름으로 지정해야한다)

스프링 컨테이너는 설정 정보를 참고해서 의존 관계를 주입(DI) 한다.

스프링 컨테이너에 등록된 Bean 조회

getBean() 메서드 활용

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("모든 빈 출력하기") void findAllBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + " object = " + bean); // name = org.springframework.context.annotation.internalConfigurationAnnotationProcessor object = org.springframework.context.annotation.ConfigurationClassPostProcessor@1a9c38eb // name = org.springframework.context.annotation.internalAutowiredAnnotationProcessor object = org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor@319bc845 // name = org.springframework.context.annotation.internalCommonAnnotationProcessor object = org.springframework.context.annotation.CommonAnnotationBeanPostProcessor@4c5474f5 // name = org.springframework.context.event.internalEventListenerProcessor object = org.springframework.context.event.EventListenerMethodProcessor@2f4205be // name = org.springframework.context.event.internalEventListenerFactory object = org.springframework.context.event.DefaultEventListenerFactory@54e22bdd // name = appConfig object = hello.core.AppConfig$$EnhancerBySpringCGLIB$$2cd7a939@3bd418e4 // name = memberRepository object = hello.core.member.MemoryMemberRepository@544820b7 // name = discountPolicy object = hello.core.dicount.FixDiscountPolicy@6b98a075 // name = memberService object = hello.core.member.MemberServiceImpl@2e61d218 // name = orderService object = hello.core.order.OrderServiceImpl@3569fc08 } } @Test @DisplayName("모든 빈 출력하기") void findApplicationBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);// Bean에 대한 메타데이터 // 스프링 내부에서 등록한 Bean이 아닌 애플리케이션 개발을 위해 추가로 등록한 Bean if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + " object = " + bean); // name = appConfig object = hello.core.AppConfig$$EnhancerBySpringCGLIB$$2cd7a939@1a9c38eb // name = memberRepository object = hello.core.member.MemoryMemberRepository@319bc845 // name = discountPolicy object = hello.core.dicount.FixDiscountPolicy@4c5474f5 // name = memberService object = hello.core.member.MemberServiceImpl@2f4205be // name = orderService object = hello.core.order.OrderServiceImpl@54e22bdd } } }

스프링컨테이너의 빈을 조회하는 방법

getBean("name", interface class) -> 빈 이름으로 조회 getBean(interface class) -> 타입으로 조회 같은 타입이 2개가 있을 경우 Exception 발생 -> getBeansOfType 사용

Map 형태로 리턴하여 타입에 해당하는 빈들을 return 한다 getBean("name", implement class) -> 구현체 타입으로 조회

BeanFactory와 ApplicationContext

<>BeanFactory <-- <>ApplicationContext <-- AnnotationConfigApplicationContext

BeanFactory?

스프링 컨테이너의 최상위 인터페이스

스프링 빈을 관리하고 조회하는 역할

ApplicationContext?

- BeanFactory의 기능을 모두 상속받아서 제공 +

- 메시지 소스를 활용한 국제화 기능

- 환경변수

- 애플리케이션 이벤트

- 편리한 리소스 조회 등...

ApplicationContext는 BeanFactory의 기능을 상속 받음

ApplicationContext는 빈 관리기능 + 편리한 부가기능을 제공

BeanFactory를 직접 사용할 일은 거의 없고 당연히 부가기능이 포함된 ApplicationContext를 주로 사용할 것

BeanFactory나 ApplicationContext를 스프링 컨테이너라고 한다.

from http://ju-bong.tistory.com/28 by ccl(A) rewrite - 2021-12-16 01:28:03