includeFilters
: 컴포넌트 스캔 대상을 추가로 지정합니다.excludeFilters
: 컴포넌트 스캔에서 제외할 대상을 지정합니다.
설정 정보와 전체 테스트 코드
public class ComponentFilterAppConfigTest {
@Test
void filterScan() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
BeanA beanA = ac.getBean("beanA", BeanA.class);
assertThat(beanA).isNotNull();
assertThrows(
NoSuchBeanDefinitionException.class,
() -> ac.getBean("beanB", BeanB.class));
}
@Configuration
@ComponentScan(
includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
static class ComponentFilterAppConfig {
}
}
inlcudeFilters
에MyIncludeComponent
애노테이션을 추가해서 BeanA가 스프링 빈에 등록됩니다.excludeFilters
에MyExcludeComponent
애노테이션을 추가해서 BeanB가 스프링 빈에 등록되지 않습니다.
FilterType 옵션
FilterType은 5가지 옵션이 있습니다.
- ANNOTATION: 기본값, 애노테이션을 인식해서 작동합니다.
- ex)
org.example.SomeAnnotation
- ex)
- ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작합니다.
- ex)
org.example.SomeClass
- ex)
- ASPECTJ: AspectJ 패턴 사용
- ex)
org.example..*Service+
- ex)
- REGEX: 정규 표현식
- ex)
org\.example\.Default.*
- ex)
- CUSTOM:
TypeFilter
이라는 인터페이스를 구현해서 처리- ex)
org.example.MyTypeFilter
- ex)
BeanA도 빼고 싶은 경우
@ComponentScan(
includeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
},
excludeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class),
@Filter(type = FilterType.ASSIGNABLE_TYPE, classes = BeanA.class)
}
)
참고:
@Component
면 충분하기 때문에,inlcudeFilters
를 사용할 일은 거의 없습니다.excludeFilters
는 여러가지 이유로 간혹 사용될 때가 있지만 많지는 않습니다.
특히 최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공하는데, 옵션을 변경하면서 사용하기보다는 스프링의 기본 설정에 최대한 맞추어 사용하는 것을 권장합니다.
참조
'Spring' 카테고리의 다른 글
[스프링 핵심 원리 - 기본편] 다양한 의존관계 주입 방법 (0) | 2021.09.19 |
---|---|
[스프링 핵심 원리 - 기본편] 중복 등록과 충돌 (0) | 2021.09.19 |
[스프링 핵심 원리 - 기본편] 탐색 위치와 기본 스캔 대상 (0) | 2021.09.19 |
[스프링 핵심 원리 - 기본편] 컴포넌트 스캔과 의존관계 자동 주입 시작하기 (0) | 2021.09.19 |
[스프링 핵심 원리 - 기본편] @Configuration과 바이트코드 조작의 마법 (0) | 2021.09.18 |
댓글