默认情况下,用 @Component
、@Repository
、@Service
、@Controller
、@Configuration
注解的类,或者本身用 @Component
注解的自定义注解是唯一被检测到的候选组件。然而,你可以通过应用自定义过滤器来修改和扩展这种行为。将它们作为 @ComponentScan
注解的 includeFilters
或 excludeFilters
属性(或作为 XML
配置中 <context:component-scan>
元素的 <context:include-filter />
或 <context:exclud-filter />
子元素)。每个过滤器元素都需要类型和表达式属性。下表描述了过滤选项。
过滤器类型 | 示例表达式 | 描述 |
---|---|---|
annotation (default) 注解(默认值) |
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
注解而使用指定的正则表达扫描到的
@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>
:::info
你也可以通过在注解上设置 useDefaultFilters=false 或者提供 use-default-filters=”false” 作为