ComponentScan Annotation
@ComponentScan은 빈을 등록하기 위한 애노테이션들을 탐색하는 위치를 지정한다
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN;
boolean useDefaultFilters() default true;
Filter[] includeFilters() default {};
Filter[] excludeFilters() default {};
boolean lazyInit() default false;
@Retention(RetentionPolicy.RUNTIME)
@Target({})
@interface Filter {
FilterType type() default FilterType.ANNOTATION;
@AliasFor("classes")
Class<?>[] value() default {};
@AliasFor("value")
Class<?>[] classes() default {};
String[] pattern() default {};
}
}
- basePackagesClasses나 basePackages를 통해 베이스 패키지를 설정할 수 있지만 설정하지 않으면 해당 애노테이션이 붙은 클래스를 기준으로 진행한다
- @ComponentScan은 @SpringBootApplication 안에 포함되어있으므로 이러한 이유로 스프링 부트의 메인 클래스는 루트 패키지에 두는 것이 좋다
- 그렇지 않으면 따로 베이스 패키지를 설정해주어야 하니까
스캔이 진행되면 @Configuration과 @Bean 및 @Component의 하위 애노테이션들이 있는 클래스 및 메소드를 찾는다. @SpringBootApplication에는 includeFilter와 excludeFilter가 있는데 각각 다음 기능을 한다
- includeFilter : 해당 클래스들을 컴포넌트 스캔 대상에 포함한다
- excludeFilter : 해당 클래스들을 컴포넌트 스캔 대상에서 제외한다
스프링 부트에서는 TypesExcludeFilter와 AutoConfigurationExcludeFilter를 컴포넌트 스캔 대상에서 제외하는데, TypeExcludeFilter와 AutoConfigurationFilter는 거의 spring-boot-test-에서 내부적으로 사용되므로 스캔에서 제외된다.
This post is licensed under CC BY 4.0 by the author.