提问者:小点点

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


在我们的WebApplication类中,我们使用的是SpringBoot,所以我们得到了默认的ComponentScan,但我想从这次扫描中排除特定的bean。我想排除所有(用@Configuration注释)AND(不用@条件alOnWebApplication注释)的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 {...}

但是它没有扫描具有这两个注释的类。我如何才能实现请求的结果?


共2个答案

匿名用户

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

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

匿名用户

无论你的包含什么,你的排除过滤器都将排除所有带有配置注释的类。你最好的方法是创建一个标记界面,并将其添加你想要包含的类,将其设置为ComponentScan中的包含过滤器。然后ComponentScan将只包含这些类。