在我们的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 {...}
但是它没有扫描具有这两个注释的类。我如何才能实现请求的结果?
您可以通过实现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将只包含这些类。