从@ComponentScan排除@Component

我有一个组件,我想从一个特定的:@ComponentScan@Configuration

@Component("foo") class Foo {
...
}

否则,它似乎与我项目中的其他类冲突。我不完全理解这种碰撞,但是如果我注释掉注释,事情就会像我想要的那样工作。但是其他依赖于此库的项目希望该类由Spring管理,因此我只想在我的项目中跳过它。@Component

我尝试使用 :@ComponentScan.Filter

@Configuration 
@EnableSpringConfigured
@ComponentScan(basePackages = {"com.example"}, excludeFilters={
  @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)})
public class MySpringConfiguration {}

但它似乎不起作用。如果我尝试使用 ,我会收到一个奇怪的错误,即无法加载一些看似随机的类:FilterType.ASSIGNABLE_TYPE

由以下原因导致:java.io.FileNotFoundException: class path resource [junit/framework/TestCase.class] 无法打开,因为它不存在

我还尝试使用如下:type=FilterType.CUSTOM

class ExcludeFooFilter implements TypeFilter {
    @Override
    public boolean match(MetadataReader metadataReader,
            MetadataReaderFactory metadataReaderFactory) throws IOException {
        return metadataReader.getClass() == Foo.class;
    }
}

@Configuration @EnableSpringConfigured
@ComponentScan(basePackages = {"com.example"}, excludeFilters={
  @ComponentScan.Filter(type=FilterType.CUSTOM, value=ExcludeFooFilter.class)})
public class MySpringConfiguration {}

但这似乎并没有像我想要的那样将组件排除在扫描之外。

如何排除它?


答案 1

配置似乎没问题,除了您应该使用而不是:excludeFiltersexcludes

@Configuration @EnableSpringConfigured
@ComponentScan(basePackages = {"com.example"}, excludeFilters={
  @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)})
public class MySpringConfiguration {}

答案 2

在扫描过滤器中使用显式类型对我来说很丑陋。我认为更优雅的方法是创建自己的标记注释:

@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreDuringScan {
}

标记应与之一起排除的组件:

@Component("foo") 
@IgnoreDuringScan
class Foo {
    ...
}

并从组件扫描中排除此注释:

@ComponentScan(excludeFilters = @Filter(IgnoreDuringScan.class))
public class MySpringConfiguration {}

推荐