春天的自定义注释

时间:2015-09-24 14:12:57

标签: spring

在我的项目中,我们设置了类似下面的内容


    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD,ElementType.ANNOTATION_TYPE, ElementType.PARAMETER})
    @Inherited
    @Documented
    @Qualifier(“MessageConverterQualifier”)
    public @interface MessageConverterRef {}

Above用于CoreConfig文件中的许多地方(基于注释的加载)


    @Bean
    @MessageConverterRef
    public DocumentToABCResponseMessageConverter 
      documentToABCResponseMessageConverter() {

    return new DocumentToABCResponseMessageConverter();
    }
    @Bean
    @MessageConverterRef
    public StringToABCResponseMessageConverter stringToABCResponseMessageConverter(
    StringToDomBasedMessageConverter stringToDomBasedMessageConverter) {
    return new StringToABCResponseMessageConverter(stringToDomBasedMessageConverter);
    }

我无法理解MessageConvertoerRef自定义注释的需求。 在使用@Bean初始化bean时,此处使用此自定义注释。

请您告诉我这是什么意思,它有什么不同。

1 个答案:

答案 0 :(得分:1)

这是一个优雅的解决方案,可确保使用相同的限定符自动装配一组bean的编译时安全性。如果您查看自定义注释@MessageConverterRef,您将看到它所装饰的唯一真正有意义的注释是:

@Qualifier(“MessageConverterQualifier”)

用例:您碰巧有一组服务于相同目的的bean(比如拥有不同类型的转换器,就像您一样),使用相同的Spring限定符(在您的情况下)使用相同的Spring限定符来注释它们会非常方便em> MessageConverterQualifier ),以便它们可以全部自动连接到列表中。

下一步是要认识到在项目中分散了一组bean,应使用相同的限定符名称进行注释,这不是最安全的,也不是最优雅的解决方案。定义您自己的注释(@MessageConverterRef)一次,并在需要的任何地方重复使用它可以减少出错的可能性(拼写错误),同时提高可读性并提供更清晰的代码。

有关该主题的更多信息,我建议您阅读相应的Spring doc,尤其是此部分:

  

限定符也适用于类型集合(如上所述):例如设置。在这种情况下,根据声明的限定符的所有匹配bean将作为集合注入。这意味着限定符不必是唯一的;它们只是简单地构成过滤标准。例如,可能有多个MovieCatalog bean使用相同的限定符值定义" action&#34 ;;所有这些都将被注入一个使用@Qualifier注释的Set中(" action")。