【问题标题】:Spring Annotation and Qualifier Based Scan基于 Spring 注释和限定符的扫描
【发布时间】:2015-01-10 23:55:51
【问题描述】:

有没有办法在春季执行基于注释的组件扫描时应用限定符?

我有几个使用自定义注释 MyAnnotation 注释的类。

@MyAnnotation
public class ClassOne {
}

@MyAnnotation
public class ClassTwo {
}

@Configuration
@ComponentScan(basePackages = { "common" }, useDefaultFilters = false, includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = MyAnnotation.class) })
public class ClassProvider {
}

我想要做的是,扫描带有此注释的类的子集,根据某些条件有选择地说明用户的某些输入。

是否可以说指定一个限定符以及注释,也可以使用组件扫描过滤器指定它,像这样 -

@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 被扫描?

【问题讨论】:

    标签: java spring annotations


    【解决方案1】:

    您可以实现自定义TypeFilter,以便您的@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 的问题。
    • 酷,但你确定不想使用Spring profile 支持吗?
    • 我之前没有真正使用过配置文件,但该选项看起来更好。如果我使用它,我可能不需要实现自定义TypeFilter。我是否正确地说它不需要伴随其他注释,如配置或组件;并且组件扫描器不会扫描类,除非任何指定的配置文件处于活动状态?
    • @ZoranRegvart 我们需要在您的示例中写入@ComponentScan.Filter(value=TypeOneFilter.class 或@ComponentScan.Filter(value=MyAnnotation.class 吗?看起来像错误,如果不是我应该在哪里创建或声明 TypeOneFilter 以了解弹簧上下文
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2018-08-05
    • 2015-02-17
    • 1970-01-01
    • 2016-06-03
    • 2014-12-26
    • 2012-09-03
    相关资源
    最近更新 更多