2010-08-18 86 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過時。

相關問題