6.10.4 使用过滤器自定义扫描
默认情况下,使用@Component,@ Repository,@ Service,@ Controller或者自身使用@Component注解标记的自定义注解标记的类是唯一检测到的候选组件。然而,您可以通过应用自定义筛选器来修改和扩展此行为。将它们添加为@ComponentScan注解的includeFilters或excludeFilters参数(或者作为component-scan元素的include-filter或exclude-filter子元素)。每个filter元素都要有type和expression属性。下表介绍了筛选选项。
表6.5. 过滤器类型
过滤器类型 |
表达式例子 |
描述 |
annotation(默认) |
org.example.SomeAnnotation |
在目标组件中以类型级别呈现注解 |
assignable |
org.example.SomeClass |
目标组件指定(扩展/实现)的类(或接口) |
aspectj |
org.example..*Service+ |
由目标组件匹配的AspectJ类型表达式 |
regex |
org.example.Default.* |
由目标组件类名匹配的正则表达式 |
custom |
org.example.MyTypeFilter |
org.springframework.core.type .TypeFilter接口的自定义实现 |
以下示例展现了忽略所有@Repository注解而使用“stub”存储库的配置。
@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>
您还可以通过在注解上设置useDefaultFilters = false或提供use-default-filters =“false”作为<component-scan />元素的属性来禁用默认过滤器。 这实际上将禁止自动检测使用@ Component,@ Repository,@ Service或@Controller注解的类。