정의
ApplicationContextInitializer는 ApplicationContext 중 ConfigurableApplicationContext를 초기화하기 위해 사용되는 함수형 인터페이스입니다.
ApplicationContext refresh 작업 전, prepareContext() 과정에서 필요한 초기 설정을 프로그래밍 적으로 초기화를 수행합니다.
initialize(C)에 지정된 파라미터의 제네릭은 ConfigurableApplicationContext입니다.
최상위 ApplicationContext는 아니지만, ApplicationContext를 1 depth를 들어간 인터페이스이기 때문에 사실상 사용하는 AnnotationConfigServletWebServerApplicationContext나 AnnotationConfigReactiveWebServerApplicationContext를 모두 처리할 수 있다고 볼 수 있습니다.
SPI ApplicationContextInitializer
spring boot autoconfigurer 및 spring core의 META-INF/spring.factories에서 다음과 같이 SPI로 생성할 ApplicationContextInitializer를 확인할 수 있습니다.
ApplicationContextInitializer 호출 시점
ApplicationContext refresh 과정 중 SpringApplication.prepareRefresh()에 있는 applyInitailizers()에 의해 ApplicationContextIntializer를 호출하고 있음을 확인할 수 있습니다.
등록된 ApplicationContextInitializer
다음과 같이 SPI를 통해 등록한 7개의 ApplicationContextInitailizer가 동작하고 있음을 확인할 수 있습니다.
- SharedMetadataReaderFactoryContextInitializer
- 메타데이터 읽기 작업 최적화를 위한 MetadataReaderFactory를 ApplicationContext에 세팅합니다.
- DelegatingApplicationContextInitializer
- 다른 ApplicationContextInitializer를 세팅하고 순서대로 호출해 ApplicationContext를 초기화하는 기능을 제공합니다.
- ContextldApplicationContextInitializer
- ApplicationContext에 Unique ID를 할당합니다.
- Context ID는 로깅, 모니터링, ApplicationContext 식별자로 사용합니다.
- ConditionEvaluationReportLoggingListener
- Condition의 결과를 저장해 로깅합니다.
- ConfigurationWarningsApplicationContextInitializer
- ApplicationContext에서 잘못된, 문제가 될 수 있는 Configuration 등을 로깅합니다.
- RSocketPortInfoApplicationContextInitializer
- RSocket 서버의 포트 정보를 ApplicationContext에 세팅합니다.
- ServerPortInfoApplicationContextInitializer
- (RSocket 서버가 아닌)일반적인 서버 포트 정보를 ApplicationContext에 세팅합니다.