2010-08-18 69 views
3

我有一组由两个属性表征的bean。它们基本上是针对不同类别和不同目的的串行器。是否有可能在Spring中使用多个@Qualifier注解?

例如,有可能是一个Order串行对本地日志,Order串行器用于记录Web服务调用,Customer串行追踪URL和Customer串行跟踪URL。

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

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

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

+0

即使您被允许使用多个注释,也无法在bean定义本身上指定多个限定符,因此您不会再进一步​​转发。 – skaffman 2010-08-18 18:18:04

+1

@skaffman这是可能的,是确切的 - http://stackoverflow.com/questions/2902335/instantiating-multiple-beans-of-the-same-class-with-spring-annotations,但我当然不会建议解决方案在生产代码中使用:) – wax 2010-08-18 20:15:37

回答

4
@Qualifier("order-url") 

分别命名组件order-url

@Component("order-url") 
+0

这就是我最终做的,但它看起来不那么干净,我希望它是。 – Fixpoint 2010-08-19 09:27:33

+0

如果您在配置中使用@Bean注释,您甚至可以为它们指定多个名称,如:@Bean({“b1”,“b2”}) 可能用于测试东西 – Dudelilama 2016-11-02 10:38:21

0

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

或者,我同意Bozho在这里,你可以在你的Spring bean中使用一些名称约定,这样bean的名字可以反映它的责任和应用领域。

+0

您能否解释Decorator模式可以如何在这种情况下使用? – Fixpoint 2010-08-19 09:20:05

9

我明白这个问题相当古老,但这是自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过时。

相关问题