Java Spring注释和基于限定符的扫描
spring中有没有一种方法可以在执行基于注释的组件扫描时应用限定符 我有几个类用我的自定义注释MyAnnotation进行了注释 我想做的是,扫描带有此注释的类的子集,有选择地基于某些条件,比如来自用户的一些输入 是否可以说指定一个限定符和注释,也可以使用组件扫描过滤器指定它,类似这样的事情-Java Spring注释和基于限定符的扫描,java,spring,annotations,Java,Spring,Annotations,spring中有没有一种方法可以在执行基于注释的组件扫描时应用限定符 我有几个类用我的自定义注释MyAnnotation进行了注释 我想做的是,扫描带有此注释的类的子集,有选择地基于某些条件,比如来自用户的一些输入 是否可以说指定一个限定符和注释,也可以使用组件扫描过滤器指定它,类似这样的事情- @MyAnnotation (qualifier = "one") public class ClassOne { } @MyAnnotation (qualifier = "two") public
@MyAnnotation (qualifier = "one")
public class ClassOne {
}
@MyAnnotation (qualifier = "two")
public class ClassTwo {
}
@Configuration
@ComponentScan(basePackages = { "common" }, useDefaultFilters = false, includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = MyAnnotation.class, qualifier = "one") })
public class ClassProvider {
}
因此,只有ClassOne被扫描?您可以实现一个自定义,以便@ComponentScan看起来像:
@ComponentScan(includeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM, value = MyAnnotation.class) })
以及TypeFilter实现:
public class TypeOneFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
final AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
if (annotationMetadata.hasAnnotation(MyAnnotation.class.getName())) {
final Map<String, Object> attributes = annotationMetadata.getAnnotationAttributes(MyAnnotation.class.getName());
return "one".equals(attributes.get("qualifier"));
}
return false;
}
}
谢谢你的回答,我会试试看;我想这就是我一直在寻找的。我还想动态设置注释上的限定符值,但我认为这更像是一个标准java注释问题,而不是一个特定于spring的问题。很酷,但您确定不想使用支持吗?我以前没有真正使用过概要文件,但该选项看起来更好。如果我使用自定义类型过滤器,我可能不需要实现它。我说它不需要附加其他注释,比如配置或组件,对吗;组件扫描程序不会扫描类,除非任何指定的配置文件处于活动状态?@ZoranRegvart在您的示例中,我们是否需要写入@ComponentScan.Filtervalue=TypeOneFilter.class或@ComponentScan.Filtervalue=MyAnnotation.class??看起来是个错误,如果不是,我应该在哪里创建或声明TypeOneFilter来了解spring上下文
public class TypeOneFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
final AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
if (annotationMetadata.hasAnnotation(MyAnnotation.class.getName())) {
final Map<String, Object> attributes = annotationMetadata.getAnnotationAttributes(MyAnnotation.class.getName());
return "one".equals(attributes.get("qualifier"));
}
return false;
}
}