-
Spring 기본 19 - 필터FrameWork/Spring&Spring-boot 2023. 11. 14. 13:06
- includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.
- excludeFilters: 컴포넌트 스캔에서 지외할 대상을 지정한다.
@Target(), @Retention, @Documented, @Indexed
해당 어노테이션에 Type레벨에 붙을 것인지 Field레벨에 붙을 것인지 지정하는 것이다. 위 어노테이션이 붙은 것은 컴포넌트 스캔에 추가 할 것 이라는 의미이다.
두개의 어노테이션 생성
생성한 어노테이션을 사용하는 Java 설정 클래와 테스트
public class ComponentFilterAppConfigTest { @Test void filterScan(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class); BeanA beanA = ac.getBean("beanA",BeanA.class); Assertions.assertNotNull(beanA); Assertions.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{ } }
- IncludeFilters 에 MyIncludeComponent 어노테이션을 추가해서 BeanA가 스프링 빈에 등록된다.
- excludeFilter에 MyExcludeCompnent 어노테이션을 추가해서 BeanB는 스프링 빈에 등록되지 않는다.
FilterType 옵션
FilterType은 5가지 옵션이 있다.
- ANNOTATION : 기본값(생략 가능), 어노테이션을 인식해서 동작한다.
- ex) org.example.SomeAnnotation
- ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인식해서 동작한다.
- ex) org.example.SomeClass
- ASPECTL : AspectJ 패턴 사용
- ex) org.example..*Service*
- REGEX : 정규표현식
- ex) org\.example\.Default.*
- CUSTOM : TypeFilter 이라는 인터페이스를 구현해서 처리
- ex) org.example.MyTypeFilter
예를 들어서 BeanA도 빼고 싶으면 다음과 같이 추가 하면된다.
➕ 참고
@Component면 충분하기 때문에 includeFilters를 사용할 일은 거의 없다. excludeFilters는 여러가지 이유로 간혹 사용할 때가 있지만 많지 않다.
특히 최근 스프링 부트는 컴포넌느 스캔을 기본으로 제고하는데, 개인적으로 옵션을 변경하면서 사용하기 보다는 스프링의 기본 설정에 맞추어 사용하는 것을 권장한다.[출처 - 스프링 핵심 원리 - 기본편]
'FrameWork > Spring&Spring-boot' 카테고리의 다른 글
스프링 기본 21 - 의존관계 자동 주입 (0) 2023.11.21 Spring 기본 20 - 중복 등록과 충돌 (0) 2023.11.14 Spring 기본 18 - 탐색 위치와 기본 스캔 대상 (0) 2023.11.14 스프링 기본 17 - 컴포넌트 스캔 (0) 2023.11.13 Spring 기본 15 - @Configuration과 싱글 (1) 2023.11.13