μ€νλ§μ μ¬μ©νλ€ λ³΄λ©΄ @Configuration, @Component, @Bean λ±μ μ΄λ Έν μ΄μ μ ν΅ν΄ μ€νλ§ μ»¨ν μ΄λμ λΉμ λ±λ‘νλλ°μ, μ΄λ ν κ³Όμ μ ν΅ν΄ Bean μ΄ λ±λ‘λλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
ν μ€νΈλ μμ κ°μ΄ @Configuration μ΄λ Έν μ΄μ μ μ€μ ν TestConfiguration ν΄λμ€κ° μ‘΄μ¬νκ³ ,
main λ©μλλ₯Ό ν¬ν¨ν Main ν΄λμ€μμ μ΄λ Έν μ΄μ κΈ°λ°μ AnnotationConfigApplicationContext κ°μ²΄λ₯Ό μμ±νκ³ , μ΄ μμ±μμλ TestConfiguration κ°μ²΄λ₯Ό μ£Όμ ν©λλ€.
μ κ³Όμ μ ν΅ν΄ μ΄λ Έν μ΄μ κΈ°λ°μ Spring Bean μ΄ λ±λ‘λλ κ³Όμ μ μ΄ν΄λ³΄κ² μ΅λλ€.
BeanFactory
BeanFactory μΈν°νμ΄μ€λ μ€νλ§ νλ μμν¬μμ μ€νλ§ λΉμ μμ±νκ³ κ΄λ¦¬νλ λ° μ¬μ©λλ ν΅μ¬ μΈν°νμ΄μ€λ‘ μ μ΄λ―Έμ§μ λ©μλλ€μ΄ μ‘΄μ¬ν©λλ€.
μ§μ μ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν μΌμ μλ§λ(?) μμ κ² κ°μ΅λλ€.
첫 컀λ°μ΄ 2008λ μ΄κ³ , λ§μ§λ§ 컀λ°μ 2023λ μΈλ° κ·Έ μ¬μ΄μ λ³κ²½λ λ΄μ©μ΄ λ§μ§λ μμ΅λλ€.
ApplicationContext
ApplicationContext μΈν°νμ΄μ€λ μ μ΄λ―Έμ§μ²λΌ BeanFactoryλ₯Ό ν¬ν¨ν λ€μν μΈν°νμ΄μ€λ₯Ό μμλ°κ³ μμ΅λλ€.
λ°λΌμ λΉμ κ΄λ¦¬νλ BeanFactory μΈν°νμ΄μ€μ κΈ°λ₯ μΈμλ λΆκ° κΈ°λ₯λ€(λ©μΈμ§ μμ€, 리μμ€ κ΄λ¦¬, μ΄λ²€νΈ λ±)μ μΈν°νμ΄μ€λ₯Ό μμλ°μ κΈ°λ₯μ μ 곡νκ³ μμ΅λλ€.
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
...
μ λ€μ΄μ΄κ·Έλ¨μ²λΌ ApplicationContextλ λ€μν κΈ°λ₯μ κ°μ§ μΈν°νμ΄μ€λ₯Ό μμν¨μΌλ‘μ¨ μ ν리μΌμ΄μ μ μν μ€μ λ€μ μ 곡νλ μΈν°νμ΄μ€λΌκ³ 보면 λ κ² κ°μ΅λλ€.
ν΄λΉ μΈν°νμ΄μ€ λν 2008λ 첫 μ»€λ° μ΄ν μ½ 15λ κ° ν¬κ² λ³κ²½λ λ΄μ©μ΄ μλ€μ. π
Test
Main ν΄λμ€μμ ApplicationContext λ₯Ό AnnotationConfigApplicationContext νμ μΌλ‘ μμ±νκΈ° λλ¬Έμ
ν΄λΉ ν΄λμ€μ register λ©μλ (μλ μ΄λ―Έμ§ 165λΌμΈ)μ λΈλ μ΄ν¬ ν¬μΈνΈλ₯Ό κ±Έκ³ λλ²κΉ μ ν΄λ΄ μλ€.
μ μ²λΌ register λ©μλμ λΈλ μ΄ν¬ ν¬μΈνΈλ₯Ό κ±Έμ΄λκ³ , νλμ© λ°λΌμ λ€μ΄κ°λ³΄κ² μ΅λλ€.
AnnotationConfigApplicationContext
@Configuration μ΄λ Έν μ΄μ μ μ€μ ν TestConfiguration κ°μ²΄μ λν΄ Bean μ λ±λ‘νκΈ° μν΄ μ λΌμΈμ΄ μ€νλκ³ μκ³ ,
readerμ beanFactoryμ ꡬν체λ μ μ΄λ―Έμ§μ κ°μ΅λλ€.
μ€μ readerμ register() λ©μλλ₯Ό μ€ννκΈ° λλ¬Έμ, reader(AnnotatedBeanDefinitionReader) ν΄λμ€λ₯Ό λ°λΌκ°λ³΄κ² μ΅λλ€.
μ°Έκ³ λ‘ AnnotationConfigApplicationContext ν΄λμ€λ μ΄λ Έν μ΄μ κΈ°λ°μ μλ° μ½λλ€μ μ€μ νλλ° μ¬μ©νλ©° ApplicationConetxt μΈν°νμ΄μ€μ ꡬν체 μ λλ€.
AnnotatedBeanDefinitionReader
μλλ AnnotationConfigApplicationContext ν΄λμ€μμ νΈμΆν this.reader.register() λΆλΆμ μ½λμ λλ€.
(registerBean() -> doRegisterBean() λ©μλ νΈμΆ)
AnnotatedBeanDefinitionReader ν΄λμ€λ λΉμ λ±λ‘μ μν μ΄νν° ν΄λμ€μ λλ€.
- AnnotatedGenericBeanDefinition: BeanDefinition μΈν°νμ΄μ€μ ꡬνμ²΄λ‘ μ΄λ Έν μ΄μ μ λ©ν λ°μ΄ν°(λΉμ μμ±κ°, μμ±μ μ 보, μ€μ½ν λ±)λ₯Ό κ°μ§κ³ μλ ν΄λμ€
- ScopeMetedata: Bean Scopeμ μ λ³΄λ‘ defaultλ "singleton"
κ·Έ μΈ λΉμ μ°μ μμλ₯Ό μ ν λ μ¬μ©νλ Primary, Lazy, Qualifier λ±μ΄ μ½λμμ 보μ΄λλ°μ, λΉμ μ€μ ν λ μμ±νλ @Primary, @Lazy, @Qualifier μ΄λ Έν μ΄μ μ΄ μ μ½λμμμ μ¬μ©μ΄ λλ κ² κ°μ΅λλ€.
beanName
beanName μ μμ±νλ μ½λμΈλ°μ, μ λ©μλλ₯Ό ν΅ν΄ λΉμ λ€μ΄λ°μ΄ κΈ°λ³Έμ μΌλ‘ μ΄λ ν λ°©μμΌλ‘ μμ±λλμ§ νμΈν μ μμ΅λλ€.
BeanDefinitionHolder: λΉμ μ 보λ₯Ό κ°μ§κ³ μλ BeanDefinition μΈν°νμ΄μ€μ Holder ν΄λμ€
μμ κ³Όμ λ€μ μνν ν λ§μ§λ§ λΌμΈμΈ BeanDefinitionReaderUtils ν΄λμ€μ registerBeanDefinition() λ©μλλ₯Ό νΈμΆν©λλ€.
(μ΄λ this.registry λ AnnotationConfigApplicationContext νμ )
BeanDefinitionReaderUtils
beanName μ κ°μ Έμ€κ³ , registryμ λΉ μ 보λ₯Ό μ μ₯νλ λ± νΉλ³ν λ΄μ©μ μλ κ² κ°μ΅λλ€.
registryμ registerBeanDefinition() λ©μλλ AnnotationConfigApplicationContext ν΄λμ€μ μμ ν΄λμ€μΈ GenericApplicationContext ν΄λμ€μ registerBeanDefinition() λ©μλκ° μ€νμ΄ λ©λλ€.
μμμ beanFactory λ DefaultListableBeanFactory μ΄κΈ° λλ¬Έμ ν΄λΉ ν΄λμ€λ₯Ό νΈμΆν©λλ€.
DefaultListbaleBeanFactory
μΌλ°μ μΌλ‘ bean μ μ κ·ΌνκΈ° μ , λͺ¨λ bean definitions λ€μ λ¨Όμ λ±λ‘ν©λλ€.
μ€μ registerBeanDefinition λ©μλλ μ½ 90λΌμΈμ λ λμ§λ§, λλΆλΆ μλ΅νμ΅λλ€.
Map<String, BeanDefinition> beanDefinitionMap νλμ Bean μ 보λ₯Ό μ μ₯ν©λλ€.
μ 리
λ무λ λΉ λ₯΄κ² νλ€λ₯ μ§λκ° κ² κ°μ΅λλ€.
μ΄λ Έν μ΄μ (@Configuration, @Componenet λ±λ±) κΈ°λ° Spring Bean μ΄ λ±λ‘λλ κ³Όμ μ κ°λ΅ν μ 리νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
- AnnotationConfigApplicationContext
- reader(AnnotatedBeanDefinitionReader) μ register() νΈμΆ
- AnnotatedBeanDefinitionReader
- abd(AnnotatedGenericBeanDefinition) λ³μμ Bean μ μ 보 μ μ₯ λ° BeanDefinitionReaderUtils.registerBeanDefinition() λ©μλ νΈμΆ
- BeanDefinitionReaderUtils
- registry(AnnotationConfigApplicationContext - GenericApplicationContext) λ₯Ό ν΅ν΄ BeanDefinition λ±λ‘
- DefaultListbaleBeanFactory
- μ΅μ’ μ μΌλ‘ Bean μ λ±λ‘νλ ν΄λμ€
- Map<string, BeanDefinition> beanDefinitionMap νλμ Bean μ 보λ₯Ό μ μ₯
'Spring > Spring Internal' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Spring @ComponentScan λμ κ³Όμ (2) | 2023.12.09 |
---|
λκΈ