3.11.2. Using filters to customize scanning
bean으로 등록할 class를 스캔할 때 기본적인 방식(기본으로 사용하는 필터)은 다음과 같습니다.
base-package 이하의 package에 속해 있는 모든 클래스 중에서 @Component 또는 @Repository 애노테이션이 붙어 있으면 모두 bean으로 사용.
이 때 명시적으로 다른 필터를 사용하여 위의 기본 방식을 변경하거나 확장할 수 있습니다. 필터 사용은 매우 간단하게 <component-scan /> 태그의 하위 태그로 정의 할 수 있습니다.
필터 태그의 종류는 include-filter와 exclude-filter 두 가지 이며 각각 type과 expression을 가지고 있습니다. type은 필터의 타입을 나타내며 expression은 말그대로 표현식을 나타냅니다.
필터에서 사용할 수 있는 타입과 표현식은 다음과 같습니다.
<context:component-scan base-package="whiteship" use-default-filters="false" />
이렇게 기본 필터의 사용을 fasle로 설정하면 @Component나 @Repository 애노테이션을 사용한 클래스 조차 bean으로 인식하지 않습니다.
<context:component-scan base-package="whiteship" use-default-filters="false">
<context:include-filter type="annotation" expression="whiteship.Bean"/>
</context:component-scan>
<context:include-filter type="annotation" expression="whiteship.Bean"/>
</context:component-scan>
Bean이라는 annotation을 만들고, @Bean 애노테이션이 붙은 것을 bean으로 읽도록 정의해 두었습니다. @Bean 애노테이션 생성은 간단합니다.
public @interface Bean {
}
요렇게 만들어 두면 되죠. 그리고 이제 그냥 사용하면 됩니다.
@Bean
public class MovieFinder {
public class MovieFinder {
}
@Bean
public class SimpleMovieLister {
public class SimpleMovieLister {
@Autowired
private MovieFinder movieFinder;
....
}
매우 간단하네요.