Spring AnnotationConfigApplicationContext

JAVA/Spring|2019. 4. 24. 13:47

이전에는 코드 살펴봤던 내용들을 정리해놓지 않아 어떻게 바뀐건지 파악하기 어려운감이 있어 정리..

 

5.1.6 기준

 

ComponentScan 경로의 클래스들을 조사해서

빈등록 혹은 스캔 대상이 되는 어노테이션이 붙어있는 대상들을 추려서 처리한다 정도겠지만

구체적으로 코드상에서 어떻게 대상들을 조사하는지를 조금 더 살펴보고자 했다.

 

 

 

일단 AnnotationConfigApplicationContext 생성자에서 

AnnotatedBeanDefinitionReader
ClassPathBeanDefinitionScanner

두가지를 생성하고 있다.

 

특히, ClassPathBeanDefinitionScanner  에서 동작을 살펴보니

spring.componentsMETA-INF/spring.components 파일이 컴포넌트 항목들을 캐시하고 있었고

componentsIndex 필드에 담고 있었다.

 

그후 생성자쪽 scan()에서 componentsIndex 필드에 캐시된 항목이 있으면

ClassPathScanningCandidateComponentProvider.addCandidateComponentsFromIndex()를 호출해서 파일에 있는 항목들을 넣고

 

캐시된 항목이 없으면 

ClassPathScanningCandidateComponentProvider.scanCandidateComponents()을 호출해서

컴포넌트 스캔 경로(classpath*:com/meteor/aaaa/**/*.class)에 있는 모든 클래스를 찾아가며

ScannedGenericBeanDefinition 객체를 빈으로 등록한다.

 

일단 빈 스캔과정은 간략하게 살펴봤고..

 

 

요약

1. spring.components 파일에 스캔 항목들 클래스와 붙어있는 어노테이션이 적혀있어 클래스로더를 찾지 않고 활용

2. spring.components 파일(캐시파일)이 없으면 클래스로더에 컴포넌트 스캔 항목 클래스들을 하나씩 분석해서 ScannedGenericBeanDefinition 객체를 만듬

 

다음에 살펴볼 내용은...

"spring.components은 어떤 타이밍에 어떻게 캐시 파일을 생성할까?"

 

 

 

 

댓글()