You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring @ComponentScan注解excludeFilters不生效问题排查

问题原因

1. 容器启动方式错误,全局包扫描优先识别了Demo类

你调用AnnotationConfigApplicationContext构造方法时传入的是包路径com.example,这种启动逻辑会触发Spring对指定包执行全局默认组件扫描:使用默认规则识别所有带@Component衍生注解的类,这个阶段就已经把com.example.Demo识别为候选Bean并注册到容器中。
你写在TestConfig里的@ComponentScan排除规则,只有将TestConfig作为核心配置类启动容器时才会生效,当前启动方式下该规则完全不会作用于Demo类的扫描流程。

2. TestConfig的扫描范围默认不包含Demo类

@ComponentScan如果没有显式指定basePackages属性,默认只会扫描当前配置类所在的包及其子包。你的TestConfig位于com.example.config包下,默认扫描范围只有com.example.config,根本覆盖不到com.example包下的Demo类,就算以TestConfig启动,排除规则也管不到Demo。

3. 正则匹配规则写法不规范

FilterType.REGEX使用正则表达式匹配类的全限定名,你写的pattern = {"com.example.Demo"}里的.是正则通配符,可匹配任意字符,并非匹配真实的点分隔符,写法不严谨。如果要完全匹配Demo类的全限定名,需要对.做转义,同时添加起止符避免包含匹配。


修复步骤

  1. 修正TestConfig的@ComponentScan配置,指定扫描范围、修正正则规则:
@Configuration
@ComponentScan(
        basePackages = "com.example", // 指定扫描范围覆盖Demo所在的包
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.REGEX,
                pattern = "^com\\.example\\.Demo$" // 转义点、加起止符实现完全匹配
        )
)
public class TestConfig {
}
  1. 修正主类启动逻辑,直接加载TestConfig作为配置类:
public class ExcludeFilterTest {
  public static void main(String[] args) {
    // 传入配置类启动,容器会执行TestConfig中定义的扫描规则
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
    // 验证是否排除成功,输出false即为正常
    System.out.println(applicationContext.containsBean("demo"));
  }
}

修改后再次运行,即可看到Demo类不会被注册到容器中。


内容的提问来源于stack exchange,提问作者Sk Monjurul Haque

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:36:04