티스토리 뷰
Flow
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
- Mapping
- Spring
- Criteria
- 복합키 Mapping
- Registrar
- java Equals
- java EqualsAndHashCode
- Embeddable Mapping
- Spring Registrar
- Join Table
- Sprint RetryTemplate
- @Primary
- Embedded Mapping
- DI
- scikit-learn
- JPA Criteria
- Spring JDBC Template
- guava
- Typesafe Config
- docker
- Akka
- Property
- Charles proxy
- JPA
- SmartLifecycle
- Discriminate Mapping
- RetryTemplate
- java generic
- spring spel
- Query DSL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |