스프링 빈이 등록되는 과정(2)

스프링 빈이 등록되는 과정(2)

1편에서는 Spring Boot을 기반으로 스프링이 빈을 어떻게 등록하는지 알아봤습니다 아주 기본적으로는 AnnotationConfigApplicationContext에 대해 알아봤는데요 그 안에 있는 AnnotatedBeanDefinitionReader를 통해 진행하며 그 안에 doScan메소드를 살펴보며 빈을 등록하는 과정을 살펴봤습니다 이번에는 xml기반인 경우 어떻게 진행이 되는지 알아보겠습니다

XmlBeanDefinitionReader

spring은 xml기반의 빈등록을 하기 위해 XmlBeanDefinitionReader라는 녀석을 통해 진행하게 됩니다. XmlBeanDefinitionReaderAbstractBeanDefinitionReader를 상속받고 있는데요. 어노테이션 기반에 사용되었던 AnnotatedBeanDefinitionReader도 이것을 상속받나? 했지만 AbstractBeanDefinitionReader는 상속받는 클래스가 없습니다. 왜일까요?? 어노테이션으로 등록하려는 빈들은 이미 클래스로더에서 꺼내올수 있기 때문이 아닐까 추측하지만 정답은 모르겠습니다 AbstractBeanDefinitionReader를 상속받는 클래스는 GroovyBeanDefinitionReader, PropertiesBeanDefinitionReader, XmlBeanDefinitionReader가 있습니다. 모두 리소스를 접근해야 하는 부분인데 이런 경우에는 AbstractBeanDefinitionReader를 상속받나 봅니다. 나중에 기회가 되면 RMI를 이용한 빈등록을 만들어보거나 위에 타입과 다른 경우의 빈등록 형식을 만들어보는것도 좋을거 같네요. 우선 Spring이 XmlBeanDefinitionReader에게 bean을 읽어오기 위한 과정부터 얘기해보려고 합니다 스프링은 컨텍스트가 생성되면서 refresh를 명령합니다. 그러면 이때 ApplicatioContext는 설정들을 다시 뒤지기 시작합니다. 그러면 최하위 ApplicationContext부터 자신이 해야할 refresh동작을 처리 한뒤 상위 refresh를 호출하게 되죠, 그러면 언젠가 AbstractApplicationContext에까지 refresh명령이 오게 됩니다. 이때 AbstractApplicationContextinvokeBeanFactoryPostProcessors메소드를 호출하게 되는데 invokeBeanFactoryPostProcessors에서는 PostProcessorRegistrationDelegate라는 딜리게이트에게 빈등록을 위임하게 됩니다. 그러면 이 딜리게이트는 BeanFactoryPostProcessor리스트를 만들게됩니다. BeanFactoryPostProcessor라는 것은 BeanPostProcessor와 같이 빈 등록에 관여하는 녀석인데 다음에 아주 자세하게 살펴보도록 하겠습니다. 어쨋든 BeanPostProcessorBeanDefinitionRegistry를 넘겨주면서 BeanFactoryPostProcessorpostProcessBeanDefinitionRegistry()메소드로 넘어가게 됩니다. Spring Boot의 경우 BeanPostProcessorConfigurationClassPostProcessor로 되어 있는데요. 여기서 호출된 postProcessBeanDefinitionRegistry메소드에서는 파라미터로 넘어온 BeanDefinitionRegistry정보를 BeanDefinitionHolder로 바꾸는 작업을 먼저 진행하고 그후 ConfigurationClassBeanDefinitionReader를 통해 BeanDefiniton을 읽도록 처리를 진행하게 됩니다. ConfigurationClassBeanDefinitionReader에서는 BeanDefinitionReader를 고르는 작업을 진행하는데 groovy 또는 xml만 받게 되는거 같습니다. xml의 설정의 경우 XmlBeanDefinitionReader가 생성되어 결국 XmlBeanDefinitionReaderloadBeanDefinitions가 호출되게 됩니다. 1 SpringApplication에서 XmlBeanDefinitionReader로 오는 호출 과정을 보면 다음과 같습니다 2 XmlBeanDefinitionReader에서는 loadBeanDefinitions메소드가 호출됨으로 시작합니다 Resource타입으로 받은 파라미터를 기준으로 doLoadBeanDefinitions가 호출될때까지 Resource를 가공합니다 doLoadBeanDefinitions에서는 xml을 파싱하기 위해 Document로 만들어 registerBeanDefinitions로 넘기게 되며 BeanDefinitionDocumentReader를 통해 빈등록을 진행하게 됩니다


 Previous
스프링 빈이 등록되는 과정(3) 스프링 빈이 등록되는 과정(3)
스프링 빈이 등록되는 과정(3)빈의 등록에 순서가 있을까? annotation으로 빈 설정을 하는 경우와 xml로 하는 경우에 있어 빈은 누가 먼저 등록이 되는걸까요? annotation은 componentScan한
2017-06-22
Next 
스프링 빈이 등록되는 과정(1) 스프링 빈이 등록되는 과정(1)
BeanDefinitionSpring의 빈설정은 대표적으로 xml과 java config(annotation)으로 구성되어 있습니다. 하지만 이말은 사실은 BeanDefinition으로 추상화되어 있는 빈설정을 xm
2017-06-11 Ahea
  TOC