기본적으로, @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이 붙은 클래스들을 탐지는 자동 탐지를 효과적으로 막아준다.
'SpringFramework Core - I. IoC 컨테이너 > 10. 클래스패스 스캐닝과 관리받는 컴포넌트들' 카테고리의 다른 글
10.6. 자동 탐지된 컴포넌트들에 이름 붙이기 (0) | 2020.04.20 |
---|---|
10.5. 컴포넌트 안에서 bean 메타데이터 정의하기 (0) | 2020.04.14 |
10.3. 자동적으로 클래스를 찾아 bean 정의로 등록시키기 (0) | 2020.04.14 |
10.2. 메타 어노테이션과 구성 어노테이션 사용하기 (0) | 2020.04.14 |
10.1. @Component와 더 많은 Stereotype 어노테이션들 (0) | 2020.04.14 |