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

时间:2016-12-15 18:52:37

标签: java spring spring-boot annotations

在我们的WebApplication类中,我们使用的是SpringBoot,因此我们获得了默认的ComponentScan,但我希望从此扫描中排除特定的bean。 我想排除所有(注释为@ConditionalOnWebApplication)AND(注释为@SpringBootApplication @ComponentScan(basePackages = { "com.yevgeny"} , includeFilters = {@ComponentScan.Filter(value = ConditionalOnWebApplication.class)} , excludeFilters = {@ComponentScan.Filter(value = Configuration.class)}) public class WebApplication extends SpringBootServletInitializer implements WebApplicationInitializer {...} )的bean。 我试过了:

ImageSource

但它没有扫描具有这两个注释的类。 我怎样才能获得重新获得的结果?

2 个答案:

答案 0 :(得分:3)

您可以通过实施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 {...}

我实际上没有测试任何这个,但它似乎是朝着正确方向迈出的一步。

答案 1 :(得分:0)

您的excludeFilters将排除所有使用Configuration注释的类,无论您的includeFilters具有什么。您最好的方法是创建一个标记界面并将其添加到您想要包含的类中,将其设置为ComponentScan中的includeFilters。然后,ComponentScan将仅包含这些类。