是否可以在Spring中使用多个@Qualifier注释?

时间:2010-08-18 13:26:10

标签: java spring dependency-injection

我有一组以两个属性为特征的bean。它们基本上是针对不同类和不同目的的序列化器。

例如,可能有一个用于本地日志的Order序列化程序,用于记录webservice调用的Order序列化程序,用于跟踪URL的Customer序列化程序和用于跟踪URL的Customer序列化程序

这就是为什么我想使用这样的两个@Qualifier注释:

@Autowired
@Qualifier("order")
@Qualifier("url")
private Serializer<Order> orderSerializer;

不幸的是,编译器在这种情况下抱怨重复注释。是否有解决此问题的解决方法或替代解决方案?

3 个答案:

答案 0 :(得分:10)

我知道这个问题相当陈旧,但这是自Spring 2.5以来你应该能够完成的事情。

您可以创建自己的注释,这些注释本身使用@Qualifier注释,这是一种注释组合形式。春天将尊重这些资格赛,就像他们自己的一样。

考虑这两个注释类型,命名与您的示例类似:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyOrderQualifier {
}

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyUrlQualifier {
}

您应该可以在您的字段上使用这两个注释,因为它们是独立的注释。

@Autowired
@MyOrderQualifier
@MyUrlQualifier
private Serializer<Order> orderSerializer;

以下是Spring 2.5 reference documentation解释此过程的链接。请注意,它适用于Spring 2.5,可能会因更新版本的Spring而过时。

答案 1 :(得分:4)

@Qualifier("order-url")

并分别命名您的组件order-url

@Component("order-url")

答案 2 :(得分:0)

当然我不知道所有细节,但这个问题更像是Decorator pattern的任务。也许,如果有必要,你可以在Spring配置中绑定它。

或者,我同意Bozho的观点,你可以在Spring bean中使用一些名称约定,以便bean名称可以反映其责任和应用领域。