如何排除使用特定注释进行注释而未使用其他注释进行注释的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 {...}
但是,这并不扫描有两个注解的类。 我怎样才能达到预期的效果?
您可以通过实现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将只包含这些类。
这种方法在我的情况下并不好,因为我想包含所有不属于上述类型的bean。 它必须是数千个豆子,因为我们的项目包括许多其他罐子。这是一个很大的项目。 – user3132197
再次阅读后,听起来像我们应该在我的回答中使用'excludeFilters'而不是'includeFilters'。我看到你接受它作为答案,但请告诉我是否属于这种情况,我会进行编辑。 – zero01alpha