【问题标题】:Custom Annotations in spring春天的自定义注释
【发布时间】:2015-09-24 14:12:56
【问题描述】:

在我的项目中,我们设置了如下所示的内容

@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD,ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) @遗传 @记录 @Qualifier(“MessageConverterQualifier”) 公共@interface MessageConverterRef {}

在CoreConfig文件中的很多地方都用到了(基于注解的加载)

@豆 @MessageConverterRef 公共 DocumentToABCResponseMessageConverter documentToABCResponseMessageConverter() { 返回新的 DocumentToABCResponseMessageConverter(); } @豆 @MessageConverterRef 公共 StringToABCResponseMessageConverter stringToABCResponseMessageConverter( StringToDomBasedMessageConverter stringToDomBasedMessageConverter) { 返回新的 StringToABCResponseMessageConverter(stringToDomBasedMessageConverter); }

我在这里无法理解 MessageConvertoerRef 自定义注释的需求。 这个自定义注解现在在使用@Bean 初始化 bean 时使用。

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

【问题讨论】:

  • 您在代码中的何处使用该自定义注释? ...在某个地方,在某个地方,应该有反射调用或类似getAnnotation(MessageConverterRef.class)的东西...否则,您的自定义注释是无用的...

标签: spring


【解决方案1】:

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

@Qualifier(“MessageConverterQualifier”))

用例:你碰巧有一组 bean 用于相同目的(比如有不同类型的转换器,就像你做的那样)用相同的 Spring Qualifier 注释它们真的很方便(在你的情况下 MessageConverterQualifier),这样它们就可以全部自动装配到一个列表中。

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

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

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

【讨论】:

  • 我的疑问恰恰是注解@MessageConverterRef 有一个限定符MessageConverterQualifier,这意味着bean 将使用这个名称进行限定。在这里,由于不同的 bean 使用了相同的注释,这是否意味着所有这些 bean 都将使用相同的限定符(MessageConverterQualifier)进行限定。如果多个 bean 具有相同的限定符,spring 将如何理解它需要引用哪个 bean。
猜你喜欢
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多