默认情况下,用 @Component@Repository@Service@Controller@Configuration注解的类,或者本身用 @Component注解的自定义注解是唯一被检测到的候选组件。然而,你可以通过应用自定义过滤器来修改和扩展这种行为。将它们作为 @ComponentScan注解的 includeFiltersexcludeFilters属性(或作为 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 注解而使用指定的正则表达扫描到的

    1. @Configuration
    2. @ComponentScan(basePackages = "org.example",
    3. includeFilters = @Filter(type = FilterType.REGEX, pattern = ".*Stub.*Repository"),
    4. excludeFilters = @Filter(Repository.class))
    5. public class AppConfig {
    6. // ...
    7. }

    下面的清单显示了等效的 XML:

    1. <beans>
    2. <context:component-scan base-package="org.example">
    3. <context:include-filter type="regex"
    4. expression=".*Stub.*Repository"/>
    5. <context:exclude-filter type="annotation"
    6. expression="org.springframework.stereotype.Repository"/>
    7. </context:component-scan>
    8. </beans>

    :::info 你也可以通过在注解上设置 useDefaultFilters=false 或者提供 use-default-filters=”false” 作为元素的属性来禁用默认过滤器。这将有效地禁止对用 @Component、@Repository、@Service、@Controller、@RestController 或 @Configuration 注解或元注解的类进行自动检测。 :::