2011-01-10 5 views
24

Ich habe mehrere Bohnen mit dem gleichen Typ (BeanType). Wie injiziere ich sie nach ID mit einer Anmerkung? Sprich:Wie injiziere ich eine Spring-Abhängigkeit nach ID?

@Autowired @ID("bean1") 
public void setBean(BeanType bean) { 
} 

Aber es gibt keine Anmerkung @ID.

Ich fand nur @Qualifier was würde bedeuten, dass ich alle meine Bohnen IDs und Qualifier geben müsste. Sicherlich gibt es einen einfacheren Weg?

Antwort

60

einfachste Lösung ist @Resource

@Resource(name="bean1") 
public void setBean(BeanType bean) { 
} 

Übrigens zu verwenden, @Qualifierwird von ID auf Bohnen zur Verwendung mit @Autowired zB

@Autowired @Qualifier("bean1") 
public void setBean(BeanType bean) { 
} 

Bezug zu nehmen, wo bean1 die ID der ist Bean injiziert werden.

Siehe Spring manual:

Für einen Rückfall übereinstimmen, wird die Bohne Name eines Standard Qualifier Wert betrachtet. Daher können Sie die Bean mit der ID "main" anstelle des geschachtelten Qualifier-Elements definieren, was zu demselben Ergebnis führt. Obwohl Sie diese Konvention verwenden können, um auf bestimmte Beans mit Namen zu verweisen, handelt es sich bei @Autowired grundsätzlich um eine typgetriebene Injektion mit optionalen semantischen Qualifizierern. Dies bedeutet, dass Qualifier-Werte, selbst wenn das Bean-Name-Fallback verwendet wird, innerhalb der Typenübereinstimmungen immer eine einschränkende Semantik aufweisen. Sie geben keinen Verweis auf eine eindeutige Bean-ID semantisch aus.

und

Wenn Sie beabsichtigen, Annotation gesteuerte Injektion von Namen zum Ausdruck bringen, nicht in erster Linie nicht @Autowired verwenden, auch wenn technisch in der Lage sind zu einem Bean Namen durch @Qualifier Werte Bezug genommen wird. Verwenden Sie stattdessen die Annotation JSR-250 @Resource, die semantisch definiert ist, um eine bestimmte Zielkomponente anhand ihres eindeutigen Namens zu identifizieren, wobei der deklarierte Typ für den Abgleichsprozess irrelevant ist.

Ich bevorzuge @Resource, es ist sauberer (und nicht Frühling-spezifisch).

+0

Hmm ... dann muss ich etwas falsch gemacht haben, weil @Qualifier keine Bohnen findet. '@ Resource' funktioniert aber. Können Sie überprüfen, ob '@ Qualifier' wirklich für IDs funktioniert? Laut den Dokumenten benötigt es ein '' Element in der Bean. –

+2

@Aaron: Die Verhaltensweisen jedes Ansatzes sind tatsächlich subtil unterschiedlich. Wenn '@ Qualifier' mit' @ Autowired' verwendet wird, wird das Qualifikationsmerkmal verwendet, um die Optionen einzuschränken, die von '@ Autowired' präsentiert werden, während' @Ressourcen' explizit eine Bean nach Namen auswählt. – skaffman

+0

@Aaron: Siehe bearbeiten – skaffman

Verwandte Themen