2010-01-28 17 views
48

Ich mag Konstruktor-basierte Injektion, wie es mir ermöglicht, injizierte Felder final zu machen. Ich mag auch Anmerkung Einspritzung, wie es vereinfacht meine context.xml. Ich kann meinen Konstruktor mit @Autowired markieren und alles funktioniert gut, solange ich nicht zwei Parameter des gleichen Typs habe. Zum Beispiel habe ich eine Klasse:Spring - inject 2 Bohnen des gleichen Typs

@Component 
public class SomeClass { 
    @Autowired(required=true) 
    public SomeClass(OtherClass bean1, OtherClass bean2) { 
     … 
    } 
} 

und einen Anwendungskontext mit:

<bean id="bean1" class="OtherClass" /> 
<bean id="bean2" class="OtherClass" /> 

Es sollte ein Weg sein, um die Bean-ID auf dem Konstruktor der Klasse angeben SomeClass, aber ich kann‘ t finde es in der Dokumentation. Ist es möglich, oder träume ich von einer Lösung, die es noch nicht gibt?

Antwort

72

@Autowired ist By-Typ (in diesem Fall); verwenden @Qualifier by-Namen autowire nach dem Beispiel from spring docs:

public SomeClass(
    @Qualifier("bean1") OtherClass bean1, 
    @Qualifier("bean2") OtherClass bean2) { 
    ... 
} 

Anmerkung: Im Gegensatz zu @Autowired die auf Feldern anwendbar ist, Konstrukteure und Mehrargument Verfahren (unter Berücksichtigung der durch Verengen Qualifier Annotationen bei der Parameter-Ebene), @Resource wird nur für Felder und Bean-Eigenschaft Setter-Methoden mit einem einzigen Argument unterstützt. Als Konsequenz sollten Sie mit Qualifikationsmerkmalen bleiben, wenn Ihr Injektionsziel ein Konstruktor oder eine Methode mit mehreren Argumenten ist.

(unter dem Text das vollständige Beispiel ist)

+2

'@ Autowire' ist nach Namen auch, aber in diesem Fall müssen Sie Etter bieten. Aber hier werden Konstruktorargumente bevorzugt, und '@ Autowire' funktioniert nicht, wenn beide Argumente vom selben Typ sind. Daher kann die Sache mit '@ Qualifier' gelöst werden. –

+0

klärte die Antwort. – Bozho

+0

Noticed ....... + 1 –

Verwandte Themen