티스토리 뷰

Flow


1. Spring Web MVC Project 시작
- was -> onStartup

java configuration 기반의 spring web mvc 프로젝트는 was에서 onStartup 메소드가 호출되면서 시작한다.
onStartup에서는 아래와 같은 일이 일어난다.

1. rootApplicationContext를 생성
2. ServletContext에 rootApplicationContext 등록
3. filter 등록
4. dispatcherServlet 등록

2. AnnotationConfigApplicationContext 생성
- was -> onStartup -> rootApplicationContext

defaultListableBeanFactory

annotationConfigApplicationContext


@ComponentScan은 rootApplicationContext으로 AnnotationConfigWebApplicationContext을 생성할 때 진행된다.
        AnnotationConfigWebApplicationContext의 생성자 주석을 보면 아래 문장을 찾을 수 있다.
"This is essentially the equivalent of AnnotationConfigApplicationContext."


3. AnnotationConfigApplicationContext이 생성 과정

- was -> onStartup -> rootApplicationContext -> regist metadata -> refresh



1. 생성자의 인자로 configuration class를 받는다.

2. this.reader = new AnnotatedBeanDefinitionReader(this); //Annotation 아래 resource

3. this.scanner = new ClassPathBeanDefinitionScanner(this); //basePackage 아래 resource 처리

4. register(configurationClasses); //configuration의 초기화 정보로 metadata를 생성/등록

5. refresh(); //초기화 과정을 진행한다. (enviroment, bean scan/생성)


4. Refresh()

- was -> onStartup -> rootApplicationContext -> regist metadata -> refresh

spring이 bean을 찾고, 생성하고 DI하는 과정이 refresh에서 일어난다.

refresh하는 과정을 보면 beanFactory가 많이 보이는데, 그 이유는 beanFactory가 실제로 spring의 bean을 생성/관리 하기 때문이다.



1. enviroment 준비

2. beanFactory 생성 (DefaultListableBeanFactory 구체 클래스)

3. beanFactory 초기화 (enviroment, resourceLoader, classLoader, postProcessor, applicationContext ...)

4. regiest postProcess to beanFactory (ex: regiest WebApplicationScopes, EnvironmentBeans)

5. invoke factory processors (ex: componetn-scan, create bean)

... 이하 생략

[ initMessageSource();

initApplicationEventMulticaster();

onRefresh();

registerListeners();

finishRefresh();     ]


5. Component-Scan PostProcessors 등록 / 실행

- was -> onStartup -> rootApplicationContext -> regist metadata -> refresh -> invokeBeanFactoryPostProcessors ->


config class를 pasing하여 meta정보 생성

component-scan을 paring하여 scan정보 생성

basePackage 이하 resource를 읽어 beanDefinition 생성/등록 한다.

AbstractApplicationContext.invokeBeanFactoryPostProcessors -> 

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors -> 

ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry ->

ConfigurationClassPostProcessor.processConfigBeanDefinitions -> 

ConfigurationClassParser.parse ->

ConfigurationClassParser.processConfigurationClass ->

ConfigurationClassParser.doProcessConfigurationClass -> //config class를 pasing하여 meta정보 생성

ComponentScanAnnotationParser.parse -> //component-scan을 paring하여 scan정보 생성

ClassPathBeanDefinitionScanner.doScan -> //basePackage 이하 resource를 읽어 beanDefinition 생성/등록

ClassPathBeanDefinitionScanner.postProcessBeanDefinition -> //@Autowire을 체크하여 있으면 AutowireCandidate에 등록

BeanDefinitionRegistry.registerBeanDefinition (DefaultListableBeanFactory) -> //registry에 beanDefinition 등록


그 이외 @PropertySource, @Import, @ImportResource, @Bean을 처리


AbstractApplicationContext.finishBeanFactoryInitialization -> 

beanFactory.preInstantiateSingletons() (DefaultSingletonBeanRegistry) //singleton bean의 생성


6. Finish BeanFactory Initialization

- was -> onStartup -> rootApplicationContext -> regist metadata -> refresh -> invokeBeanFactoryPostProcessors ->

 ... -> finishBeanFactoryInitialization


beanDefinition을 읽어서 실제 bean을 생성/등록 한다.


beanFactory.preInstantiateSingletons() (DefaultSingletonBeanRegistry) //singleton bean의 생성





Detail


1. AbstractApplicationContext

** applicationContext의 abstract class로 resource, enviroment 그리고 bean을 생성/관리 한다.


- refresh()

- configuration class를 parsing하여 meta 정보를 생성한다.

- meta 정보를 기반으로 resource, enviroment를 초기화한다.

- meta 정보를 기반으로 beanDefinition을 생성한다.

- beanDifinition을 기반으로 bean을 생성한다.


- invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)

- meta 정보를 기반으로 특정 class나 basePackage의 모든 resource를 읽어 beanDifinition을 생성한다.


2. PostProcessorRegistrationDelegate

** beanFactory의 postProcessor를 관리한다.


- invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> postProcessors)

postProcessor를 등록, 정렬, 실행한다.


3. ConfigurationClassPostProcessor

** config와 관련된 postProcessor를 관리한다.


- postProcessBeanDefinitionRegistry(beanDefinitionRegistry registry)

- config class 설정과 관련된 postProcess를 등록/실행 한다.


- processConfigBeanDefinitions(BeanDefinitionRegistry registry)

- component를 scan하여 beanDefinitionRegistry에 beanDefinition을 등록한다.


4. ConfigurationClassParser

** config class를 읽어와 설정 정보를 pasing하고 처리한다.


- parse(Set<BeanDefinitionHolder> configCandidates)

- config class의 설정을 parsing 한다.


- processConfigurationClass(ConfigurationClass configClass)

- parsing한 정보로 초기화 한다.


- doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)

- @ComponentScan, @Import, @Bean 등에 해당하는 config class 정보를 처리한다.


5. ComponentScanAnnotationParser

** componentScan annotaion을 parsing하고 처리한다.


- parse(AnnotationAttributes componentScan, String declaringClass)

- componentScan annotation에 등록된 class나 basePackage를 기준으로 scan할 resource basePackages를 정리한다.

- exclude baskPackage filter를 적용한다.


6. ClassPathBeanDefinitionScanner

** class path 이하 모든 resource를 읽어서 beanDefinition을 생성/등록 한다.


- doScan(String... basePackages)

- basePackages아래 모든 resource를 읽어온다.

- beanDefinition을 생성한다.

- @Autowired annotation을 체크하여 autowireCandidate에 추가하고, postProcessor로 처리한다.

- @Lazy, @Role 등.. 다른 annotation을 체크하여 처리한다.


- registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)

- BeanDefinition을 BeanDefinitionRegistry에 등록한다.


7. AbstractApplicationContext

** applicationContext의 abstract class로 resource, enviroment 그리고 bean을 생성/관리 한다.


- finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)

- bean 생성과 관련된 초기화를 마무리한다.


8. DefaultListableBeanFactory

** bean의 생성/등록/관리 한다.


- preInstantiateSingletons()

- bean 실제 인스턴스로 생성/등록한다.



'Programming > Spring' 카테고리의 다른 글

AOP  (0) 2019.03.27
Request Proxy  (0) 2019.03.27
Argument Resolver  (0) 2019.03.27
Interceptor  (1) 2019.03.27
DI (Dependency Injection)  (2) 2018.11.01
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함