组件扫描排除筛选器在春季不工作 4.0.6.RELEASE

我有一个类,我想在组件扫描时排除它。我正在使用下面的代码来做到这一点,但这似乎不起作用,尽管一切似乎都是正确的

@ComponentScan(basePackages = { "common", "adapter", "admin"}, excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ServiceImpl.class) })

实际上,我希望在我的 rest api 逻辑中使用实现 “ServiceImpl” 接口的 “ServiceImpl” 类,在进行 api 的集成测试时,我想排除此实现并加载模拟实现。但这似乎没有发生,因为即使在使用上述内容后,我也得到了以下错误

No qualifying bean of type [admin.Service] is defined: expected single matching bean but found 2: ServiceMockImpl,ServiceImpl

我花了太多时间在这上面,但没有任何效果。

任何帮助是值得赞赏的。


答案 1

经过大量的工作和研究,我注意到Spring的行为在组件扫描方面有点奇怪。

文物是这样的:

ServiceImpl是实现接口的实际实现类。 是实现接口的模拟植入类。ServiceServiceMockImplService

我想调整组件扫描,使其仅加载,但不加载.ServiceMockImplServiceImpl

我不得不在测试配置类中添加 ,以从组件扫描中排除该特定类。但是,即使在执行上述更改后,这两个类仍然被加载,并且测试都失败了。@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ServiceImpl.class)@ComponentScan

经过大量的工作和研究,我发现正在加载,因为另一个类正在加载,并且其中的所有包都已加载。因此,我添加了代码以从组件扫描中排除该类,如下所示。ServiceImpl@ComponentScanApplication@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Application.class)

之后,它按预期工作。

代码如下

@ComponentScan(
    excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = OAuthCacheServiceImpl.class),
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Application.class)
    },
    basePackages = {
        "common", "adapter", "admin"
    }
)

我已经看到很多关于组件扫描的问题长期以来一直没有得到解答,因此我想添加这些细节,因为它可能会在未来帮助某人。

嗯......


答案 2

起初,非常感谢@Yuriy和@ripudam的答案,但是让我感到困惑的是,当我的excludeFilters包含配置时.class我必须使用@Import来导入由@Configuration注释的Classe.我发现当我使用excludeFilters = {@Filter(type = FilterType.ANNOTATION,value{EnableWebMvc.class,Controller.class}时,一切正常。ContextLoaderListener 最初不会注册控制器。

例如

//@Import(value = { SecurityConfig.class, MethodSecurityConfig.class, RedisCacheConfig.class, QuartzConfig.class })
@ComponentScan(basePackages = { "cn.myself" }, excludeFilters = {
        @Filter(type = FilterType.ANNOTATION,value={EnableWebMvc.class,Controller.class}) })
public class RootConfig {
}

推荐