2010-01-28 22 views
48

Mi piace l'iniezione costruttore-based in quanto mi permette di fare campi iniettati final. Mi piace anche l'iniezione guidata dall'annotazione perché semplifica il mio context.xml. Posso contrassegnare il mio costruttore con @Autowired e tutto funziona correttamente, purché non disponga di due parametri dello stesso tipo. Per esempio, ho una classe:Spring - iniettare 2 fagioli dello stesso tipo

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

e di un contesto di applicazione con:

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

Ci dovrebbe essere un modo per specificare l'ID di fagioli sul costruttore della classe SomeClass, ma posso' lo trovi nella documentazione. È possibile o sto sognando una soluzione che non esiste ancora?

risposta

72

@Autowired è di tipo (in questo caso); utilizzare @Qualifier per autowire per nome, seguendo l'esempio from spring docs:

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

Nota: A differenza @Autowired applicabile ai campi, costruttori e metodi multi argomento (che consentono ambito attraverso annotazioni qualificazione al livello parametro), @Resource è supportato solo per i campi e i metodi di settaggio della proprietà bean con un singolo argomento. Di conseguenza, attenersi ai qualificatori se il target di iniezione è un costruttore o un metodo a più argomenti.

(di seguito il testo che è l'esempio completo)

+2

'@ Autowire' è per nome troppo, ma in tal caso è necessario fornire setter. Ma qui gli argomenti del costruttore sono preferiti e '@ Autowire' non funzionerà se entrambi gli argomenti sono dello stesso tipo. Quindi, la cosa può essere risolta usando '@ Qualifier'. –

+0

ha chiarito la risposta. – Bozho

+0

Notato ....... + 1 –

Problemi correlati