在我的项目中,我们设置了类似下面的内容
@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时,此处使用此自定义注释。
请您告诉我这是什么意思,它有什么不同。
答案 0 :(得分:1)
这是一个优雅的解决方案,可确保使用相同的限定符自动装配一组bean的编译时安全性。如果您查看自定义注释@MessageConverterRef
,您将看到它所装饰的唯一真正有意义的注释是:
@Qualifier(“MessageConverterQualifier”)
)
用例:您碰巧有一组服务于相同目的的bean(比如拥有不同类型的转换器,就像您一样),使用相同的Spring限定符(在您的情况下)使用相同的Spring限定符来注释它们会非常方便em> MessageConverterQualifier ),以便它们可以全部自动连接到列表中。
下一步是要认识到在项目中分散了一组bean,应使用相同的限定符名称进行注释,这不是最安全的,也不是最优雅的解决方案。定义您自己的注释(@MessageConverterRef
)一次,并在需要的任何地方重复使用它可以减少出错的可能性(拼写错误),同时提高可读性并提供更清晰的代码。
有关该主题的更多信息,我建议您阅读相应的Spring doc,尤其是此部分:
限定符也适用于类型集合(如上所述):例如设置。在这种情况下,根据声明的限定符的所有匹配bean将作为集合注入。这意味着限定符不必是唯一的;它们只是简单地构成过滤标准。例如,可能有多个MovieCatalog bean使用相同的限定符值定义" action&#34 ;;所有这些都将被注入一个使用@Qualifier注释的Set中(" action")。