Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring注释和基于限定符的扫描_Java_Spring_Annotations - Fatal编程技术网

Java Spring注释和基于限定符的扫描

Java Spring注释和基于限定符的扫描,java,spring,annotations,Java,Spring,Annotations,spring中有没有一种方法可以在执行基于注释的组件扫描时应用限定符 我有几个类用我的自定义注释MyAnnotation进行了注释 我想做的是,扫描带有此注释的类的子集,有选择地基于某些条件,比如来自用户的一些输入 是否可以说指定一个限定符和注释,也可以使用组件扫描过滤器指定它,类似这样的事情- @MyAnnotation (qualifier = "one") public class ClassOne { } @MyAnnotation (qualifier = "two") public

spring中有没有一种方法可以在执行基于注释的组件扫描时应用限定符

我有几个类用我的自定义注释MyAnnotation进行了注释

我想做的是,扫描带有此注释的类的子集,有选择地基于某些条件,比如来自用户的一些输入

是否可以说指定一个限定符和注释,也可以使用组件扫描过滤器指定它,类似这样的事情-

@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;
    }

}