📖 ✏️
- TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.
- 그 외 시리즈에 작성된 공유 목적의 포스팅은 시간이 날 때마다 별도로 작성하고 있습니다. 주로, TIL 시리즈에 작성된 내용에서 특정 주제를 선정하고, 더 깊이 공부한 후 정리하여 작성합니다.
컴포넌트 스캔 방식을 사용할 때, includeFilters
와 excludeFilters
를 이용하여 컴포넌트 스캔 대상을 추가하거나 제외할 수 있다. 주로 @Component
만 사용하는 경우가 많지만, 간혹 excludeFilters
를 사용하는 경우가 발생한다.
컴포넌트 스캔의 추가, 제외 테스트를 통해 Filter 사용 방법을 확인해 보자.
테스트 코드는 includeFilters
를 이용하여, beanA
를 컴포넌트 스캔에 포함하였다. 그리고 excludeFilters
를 이용하여 beanB
를 컴포넌트 스캔에서 제외하였다.
테스트 결과를 통해 포함 필터가 적용된 BeanA
는 isNotNull()
을 통과하며, 제외 필터가 적용된 BeanB
는 NoSuchBeanDefinitionException
발생 조건을 통과하는 것을 확인 할 수 있다.
설정 정보와 전체 테스트 코드
public class ComponentFilterAppConfigTest {
@Test
void filterScan() {
ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
BeanA beanA = ac.getBean("beanA", BeanA.class);
Assertions.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 {
}
}
컴포넌트 스캔 대상에 추가할 애노테이션
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {
}
컴포넌트 스캔 대상에서 제외할 애노테이션
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {
}
컴포넌트 스캔 대상에 추가할 클래스
@MyIncludeComponent
public class BeanA {
}
컴포넌트 스캔 대상에서 제외할 클래스
@MyExcludeComponent
public class BeanB {
}
FilterType은 5가지 옵션이 있다.
ANNOTATION
: 기본값이므로, 아래와 같이 지정하지 않아도 애노테이션을 인식하여 동작한다.
@Configuration
@ComponentScan(
includeFilters = @Filter(classes = MyIncludeComponent.class),
excludeFilters = @Filter(classes = MyExcludeComponent.class)
)
static class ComponentFilterAppConfig {
}
ASSIGNABLE_TYPE
: 지정한 타입과 자식 타입을 인식해서 동작한다. 클래스를 직접 지정하는 방식이다
ASPECTJ
: AspectJ 패턴 사용
REGEX
: 정규 표현식
CUSTOM
: TypeFilter 이라는 인터페이스를 구현해서 처리
includeFilters
: 컴포넌트 스캔 대상을 추가로 지정한다. excludeFilters
: 컴포넌트 스캔 제외 대상을 지정한다.