Springμμ ν΄λμ€μ @Configuration, @RestController, @Service λ±μ μ΄λ
Έν
μ΄μ
μ μ μΈνλ©΄ μ€νλ§μ ν΄λΉ μ΄λ
Έν
μ΄μ
λ€μ μ€μΊν΄μ λΉμΌλ‘ λ±λ‘μ ν΄μ£Όλλ°μ, μ΄λ¬ν μν μ νλ κ²μ΄ @ComponentScan μ΄λ
Έν
μ΄μ
μ
λλ€.
@ComponentScan μ λ¨μ΄ κ·Έλλ‘ @Component μ΄λ Έν μ΄μ μ΄ λΆμ ν΄λμ€λ€μ μ€μΊνμ¬ μ€νλ§ λΉμΌλ‘ λ±λ‘νλλ°, μμ μΈκΈλ μ΄λ Έν μ΄μ λ€μ λͺ¨λ λ΄λΆμ @Component μ΄λ Έν μ΄μ μ κ°μ§κ³ μμ΅λλ€.
μμ κ°μ μ΄λ Έν μ΄μ λ€μ μ€μ νλ©΄ μ€νλ§μμλ μ΄λ»κ² μ»΄ν¬λνΈλ€μ μ€μΊνκ³ , μ€νλ§ λΉμΌλ‘ λ±λ‘νλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
@ComponentScan
ComponentScan μ΄λ Έν μ΄μ μ μ‘΄μ¬νλ μ£ΌμμΌλ‘, λλ΅μ μΈ μλ―Έλ λ€μκ³Ό κ°μ΅λλ€.
@Configuration ν΄λμ€λ€κ³Ό ν¨κ» μ»΄ν¬λνΈ μ€μΊμ ꡬμ±νλ©°,
basePackageClasses νΉμ basePackages μ€ νλλ₯Ό μ§μ νμ¬ μ€μΊν ꡬ체μ μΈ ν¨ν€μ§λ₯Ό μ μν©λλ€.
λ§μ½ ꡬ체μ μΈ ν¨ν€μ§κ° μ μλμ§ μμμ κ²½μ°, μ΄ μ΄λ Έν μ΄μ μ΄ μ μλ ν΄λμ€μ ν¨ν€μ§λ‘λΆν° μ€μΊμ΄ μνλ©λλ€.
...
@ComponentScan μ΄λ Έν μ΄μ μ @SpringBootApplication μ΄λ Έν μ΄μ μ μ‘΄μ¬νλλ°μ, κ·Έλ κΈ° λλ¬Έμ λ°λ‘ μ€μ νμ§ μμΌλ©΄ main() λ©μλκ° μ‘΄μ¬νλ ν¨ν€μ§λΆν° μ€μΊμ νκ² λ©λλ€.
μ€νλ§μ΄ μ»΄ν¬λνΈλ€μ μ΄λ ν¨ν€μ§μμ μ€μΊν μ§λ ComponentScanAnnotationParser ν΄λμ€μμ @ComponentScan μ΄λ Έν μ΄μ μ νμ±νμ¬ μ μν©λλ€.
ComponentScanAnnotationParser
ν΄λΉ ν΄λμ€λ ν΄λμ€λͺ κ·Έλλ‘ @ComponentScan μ΄λ Έν μ΄μ μ νμ±νλ ν΄λμ€μ λλ€.
@ComponentScan μ΄λ Έν μ΄μ μ μ‘΄μ¬νλ λ©μλλ€μ λλ€.
- value(): basePackagesμ alias
- basePackages(): μ΄λ Έν μ΄μ μ»΄ν¬λνΈλ₯Ό μ€μΊνλ κΈ°λ³Έ ν¨ν€μ§
- basePackageClasses(): basePackages()μ Type-safe λμμΌλ‘, μ§μ λ κ° ν΄λμ€μ ν¨ν€μ§λ₯Ό μ€μΊ
- nameGenerator(): μ€νλ§ μ»¨ν μ΄λμμ νμ§λ μ»΄ν¬λνΈλ€μ μ΄λ¦μ μ§μ νλ λ° μ¬μ© (BeanNameGenerator)
- scopeResolver(): μ»΄ν¬λνΈμ Scope λ²μ νμΈ
- scopeProxy(): μ»΄ν¬λνΈμ νλ‘μκ° μμ±λμ΄μΌ νλμ§ κ²°μ
- resourcePattern(): μ»΄ν¬λνΈμ μ ν©ν ν΄λμ€ νμΌ μ μ΄ (λ³΄λ€ μ μ°ν μ κ·Όμ μν΄ includeFilters, excludeFilters κ³ λ €)
- useDefaultFilters(): @Component, @Repository, @Service, @Controller μ΄λ Έν μ΄μ μ΄ λ¬λ¦° ν΄λμ€λ€μ λν΄ μλμΌλ‘ μ€μΊν μ§ νμ±ν μ¬λΆ (default = true)
- includeFilters(): μ»΄ν¬λνΈ μ€μΊλμ μ ν©ν νμ μ λͺ μμ μΌλ‘ μ§μ (νΉμ 쑰건μ λ§μ‘±νλ ν΄λμ€λ§ μ€μΊ)
- excludeFilters(): μ»΄ν¬λνΈ μ€μΊλμ μ ν©νμ§ μμ νμ μ λͺ μμ μΌλ‘ μ§μ (includeFilters μ μ¬μ©λ² λμΌ)
parse() λ©μλλ₯Ό ν΅ν΄ @ComponentScan μ΄λ Έν μ΄μ μ μ‘΄μ¬νλ λ©μλλ€μ νμ±ν©λλ€.
@SpringBootApplication μ΄λ Έν μ΄μ λ΄μ μ‘΄μ¬νλ @ComponentScanμ κΈ°λ³Έμ μΌλ‘ basePackage, basePackageClasses λ±μ λν΄ λ°λ‘ μ€μ νμ§ μκΈ° λλ¬Έμ @SpringBootApplication μ΄λ Έν μ΄μ μ΄ μ‘΄μ¬νλ ν¨ν€μ§λ₯Ό basePackages λ‘ μ€μ ν©λλ€.
μ @ComponentScan μ νμ±μ΄ λλλ©΄, scanner(ClassPathBeanDefinitionScanner) λ‘ μ»΄ν¬λνΈλ₯Ό μ€μΊν©λλ€.
ClassPathBeanDefinitionScanner
ν΄λμ€ κ²½λ‘μμ Bean ν보λ₯Ό νμ§νλ bean definition μ€μΊλλ‘, (BeanFactory νΉμ ApplicationContext)μ λ μ§μ€νΈλ¦¬μ λΉμ λ±λ‘ν©λλ€.
νμ¬ ν μ€νΈλ₯Ό μν΄ μ€μ ν @Component μ΄λ Έν μ΄μ μ λμμ λ€μκ³Ό κ°μ΅λλ€. (@Configuration, @RestController, @Service)
doScan() λ©μλμμ ν΅μ¬ κΈ°λ₯μ ν¬κ² μ»΄ν¬λνΈ ν보 μ‘°ν -> beanName μμ± -> BeanDefinition λ±λ‘ μ λλ€.
- findCandidateComponents() -> generateBeanName() -> registerBeanDefinition()
findCandidateComponents() λ©μλλ‘ μ‘°νλ κ°μ²΄λ€μ λλ€.
μ§μ @Component λμμΌλ‘ λ±λ‘λ 3κ°μ κ°μ²΄λ€μ΄ μ‘΄μ¬ν©λλ€.
ν΄λΉ μ»΄ν¬λνΈλ μ§λ λ² Spring Bean μ΄ λ±λ‘λλ κ³Όμ μμ μ΄ν΄λ΄€λ―μ΄, DefaultListableBeanFactory ν΄λμ€μμ beanDefinitionMap μ μ μ₯νμ¬ λΉμ λ±λ‘&κ΄λ¦¬ν©λλ€.
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
'Spring > Spring Internal' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Spring Bean μ΄ λ±λ‘λλ κ³Όμ (0) | 2023.12.02 |
---|
λκΈ