빈을 읽는 방법
ConfigurableApplicationContext 를 선택하는 방법
SpringApplication 의 run 에서
createApplicationContext() 를 통해 선정된다.
createApplicationContext() 에서는 SpringApplication 이 생성될 때 기본값으로 생성된 ApplicationContextFactory 로 applicationContext 를 만든다. 만들 때 webApplicationType(enum) 을 인자로 주는데, 이 인자는 SpringApplication 의 생성자에서 deduceFromClasspath() 메서드를 통해 설정된다.
해당 메서드에서는 DispatcherHandler 가 class loader 에 있고, DispatcherServlet 과 ServletContainer 가 없어야 REACTIVE 를 반환하고 아니면 SERVLET 을 반환한다.
ApplicationContextFactory 의 구현체는 DefaultApplicationContextFactory 인데, 여기서 create 를 한다. 결과적으로 context 는 AnnotationConfigReactiveWebServerApplicationContext 이 선정된다.
빈은 언제 등록될까
•
SpringApplication.createApplicationContext()
◦
DefaultApplicationContextFactory.create()
◦
DefaultApplicationContextFactory.getFromSpringFactories()
◦
ReactiveWebServerApplicationContextFactory.create(WebApplicationType)
◦
ReactiveWebServerApplicationContextFactory.createContext()
◦
AnnotationConfigReactiveWebServerApplicationContext()
◦
initAnnotationConfigReactiveWebServerApplicationContext. newAnnotatedBeanDefinitionReader(this) → this = ACRWSAC
◦
init AnnotatedBeanDefinitionReader.AnnotationConfigUtils.registerAnnotationConfigProcessors()
◦
AnnotationConfigUtils.registerAnnotationConfigProcessors()
◦
AnnotationConfigUtils.registerPostProcessor()
◦
registry.registerBeanDefinition() registry → GenericApplicationContext
◦
GenericApplicationContext.registerBeanDefinition()
◦
DefaultListableBeanFactory.registerBeanDefinition()
빈은 어디서 등록될까
DefaultListableBeanFactory 의 registerBeanDefinition