如何排除使用特定注释进行注释而未使用其他注释进行注释的bean的扫描?

问题描述:

在我们的WebApplication类中,我们使用SpringBoot,所以我们得到了默认的ComponentScan,但是我想从这次扫描中排除特定的bean。 我想排除所有豆类(用@Configuration注释)和(不是注释用@ConditionalOnWebApplication)。 我想:如何排除使用特定注释进行注释而未使用其他注释进行注释的bean的扫描?

@SpringBootApplication 
@ComponentScan(basePackages = { "com.yevgeny"} , includeFilters = {@ComponentScan.Filter(value = ConditionalOnWebApplication.class)} , excludeFilters = {@ComponentScan.Filter(value = Configuration.class)}) 
public class WebApplication extends SpringBootServletInitializer implements WebApplicationInitializer {...} 

但是,这并不扫描有两个注解的类。 我怎样才能达到预期的效果?

+0

再次阅读后,听起来像我们应该在我的回答中使用'excludeFilters'而不是'includeFilters'。我看到你接受它作为答案,但请告诉我是否属于这种情况,我会进行编辑。 – zero01alpha

您可以通过实现org.springframework.core.type.filter.TypeFilter

public class CustomFilter implements TypeFilter { 

    @Override 
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) 
     throws IOException { 
     Set<String> annotations = metadataReader.getAnnotationMetadata().getAnnotationTypes(); 

     return annotations.contains(Configuration.class.getName()) 
      && !annotations.contains(ConditionalOnWebApplication.class.getName()); 
    } 

} 

创建自定义过滤器,然后结束了这样的事情

@SpringBootApplication 
@ComponentScan(includeFilters = @Filter(type=FilterType.CUSTOM, value=CustomFilter.class)) 
public class WebApplication extends SpringBootServletInitializer implements WebApplicationInitializer {...} 

我其实没有测试任何这一点,但它似乎是一个一步在正确的方向。

您的excludeFilters将不包含所有使用Configuration注释的类,无论您的includeFilters具有什么。你最好的方法是创建一个标记接口并添加你想要包含的类,并将其设置为你的ComponentScan中的includeFilters。 ComponentScan将只包含这些类。

+0

这种方法在我的情况下并不好,因为我想包含所有不属于上述类型的bean。 它必须是数千个豆子,因为我们的项目包括许多其他罐子。这是一个很大的项目。 – user3132197