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
는 여러가지 이유로 간혹 사용될 때가 있지만 많지는 않습니다.
특히 최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공하는데, 옵션을 변경하면서 사용하기보다는 스프링의 기본 설정에 최대한 맞추어 사용하는 것을 권장합니다.