본문 바로가기

SpringFramework Core - I. IoC 컨테이너/10. 클래스패스 스캐닝과 관리받는 컴포넌트들

10.4. 스캐닝을 커스터마이즈하기 위해 필터 사용하기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-scanning-filters

 

 

기본적으로, @Component, @Repository, @Service, @Controller, @Configuration, @Component를 포함한 커스텀 어노테이션 등이 붙은 클래스들만이 후보 컴포넌트로서 탐지된다. 그러나 커스텀한 필터를 적용함으로써 이 행동을 바꾸거나 확장시킬 수 있다. 커스텀한 필터들을 @ComponentScan 어노테이션의 includeFilters나 excludeFilters 속성에 추가하자(또는 XML 설정의 <context:component-scan>의 자식인 <context:include-filter/> 이나 <context:exclude-filter/>). 각 필터 요소들은 type과 expression 속성들을 필요로한다. 다음 테이블은 필터 옵션을 설명하고 있다.

필터 타입 표현식 예시 설명
annotation(기본) org.example.SomeAnnotation 대상 컴포넌트들의 타입 수준에서 표현되거나 meta-present되는 어노테이션
assignable org.example.SomeClass 대상 컴포넌트들이 지정 가능한(확장하거나 구현) 클래스들(또는 인터페이스)
aspectj org.example..*Service+ 대상 컴포넌트들에 매치되는 AspectJ 타입 표현식
regex org\.example\.Default.* 대상 컴포넌트의 클래스명과 매치되는 정규표현식
custom org.example.MyTypeFilter org.springframework.core.type.TypeFilter 인터페이스의 커스텀 구현체

다음 예시는 모든 @Repository 어노테이션들을 무시하고 "스텁" 저장소들을 대신 사용하는 설정을 보여준다.

@Configuration
@ComponentScan(basePackages = "org.example",
        includeFilters = @Filter(type = FilterType.REGEX, pattern = ".*Stub.*Repository"),
        excludeFilters = @Filter(Repository.class))
public class AppConfig {
    ...
}

다음 같은 내용의 XML 설정이다.

<beans>
    <context:component-scan base-package="org.example">
        <context:include-filter type="regex" expression=".*Stub.*Repository' />
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />
    </context:component-scan>
</beans>

※ 어노테이션의 userDefaultFilters=False를 설정하거나 <component-scan/> 요소의 속성으로서 use-default-filters="false"를 제공함으로써 기본 필터들을 사용하지 않을 수도 있다. 이는 @Component, @Repository, @Service, @Controller, @RestController, @Configuration이 붙은 클래스들을 탐지는 자동 탐지를 효과적으로 막아준다.