ApplicationContext (Spring에서의 IoC Container)BeanFactory와 ApplicationContext의 차이점BeanConfiguration MetadataApplicationContext 생성 코드(Java 기반 Configuration metadata)ApplicationContext를 CustomClass에서 이용하기 위해서는? → ApplicationContextAware interface를 구현
ApplicationContext (Spring에서의 IoC Container)

- 일종의 IoC 컨테이너임
- 어떠한 클래스를 사용할 것인지 레지스터 해주면, 생명주기를 Managing하면서 객체를 만들어줌
- 스프링에서는 이런 IoC 컨테이너를 ApplicationContext 인터페이스로 제공을 함
BeanFactory와 ApplicationContext의 차이점

- https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction — BeanFactory에 비해 추가된 기능들 설명(BeanFactory interface 를 상속받음)
- Spring AOP feature들과의 쉬운 통합
- Message resource handling (for use in internationalization)
- Event publication
- Application-layer specific contexts such as the
WebApplicationContext
for use in web applications.
- BeanFactory는 configuration framework와 basic functionality를 제공
- ApplicationContext는 enterprise-specific functionality 를 더함
Bean
- BeanFactory, IoC Container에 의해 관리되어지는 객체를 말함
- 우리가 일반적으로 자바에서 객체를 만들면 JVM에 올라갈 건데, 여기서 IoC에서 관리되는 객체와 아닌 객체를 구분하기 위해 Bean이라는 용어 도입한 것
Configuration Metadata
- 스프링의 ApplicationContext는 실제 만들어야 할 정보를 Configuration Metadata(설정 메타데이터)로부터 받아옴
- 이 메타데이터를 이용해서 IoC 컨테이너에 의해 관리되는 객체들을 생성하고 구성함
- 어플리케이션에서 객체들의 도면이라고 볼 수 있음
- Configuration Metadata를 XML 기반으로 하는 경우 GenericXmlApplicationContext를 구현체로 사용하여 ApplicationContext를 구현(요즘에는 자바 기반으로 많이 작성한다고 함 — @Configuration)
- JAVA 기반 ⇒ AnnotationConfigApplicationContext 구현체를 이용
ApplicationContext 생성 코드(Java 기반 Configuration metadata)
@Configuration public class AppConfiguration { @Bean public VoucherRepository voucherRepository(){ return new VoucherRepository() { @Override public Optional<Voucher> findById(UUID voucherId) { return Optional.empty(); } }; } @Bean public OrderRepository orderRepository(){ return new OrderRepository(){ @Override public void insert(Order order) { } }; } @Bean public VoucherService voucherService(){ // voucherService(VoucherRepository voucherRepository) 의 형태로 작성해도 // IoC container가 알아서 Dependency resolution을 진행해줌(VoucherRepository가 // Bean으로 선언되어 있기 때문에 return new VoucherService(voucherRepository()); } @Bean public OrderService orderService(){ return new OrderService(voucherService(), orderRepository()); } } // client code AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfiguration.class); var orderService = applicationContext.getBean(OrderService.class);
ApplicationContext를 CustomClass에서 이용하기 위해서는? → ApplicationContextAware interface를 구현
public class ApplicationContextProvider implements ApplicationContextAware{ private static ApplicationContext context; public static ApplicationContext getApplicationContext() { return context; } @Override public void setApplicationContext(ApplicationContext ac) throws BeansException { context = ac; } }
- 위와 같이 ApplicationContextAware를 implements하게 되면, spring boot 가 시작되면서 bean을 생성하고 ApplicationContextAwareProcessor에서 invokeAwareInterfaces를 부르면서 setApplicationContext를 불러줌으로써 ApplicationContext 값이 주입되게 됨
- 그렇게 되고 나면 ApplicationContextProvider.getApplicationContext 메서드로 context에 대해 접근이 가능함