2010-01-28 21 views
48

Me gusta la inyección basada en el constructor, ya que me permite hacer campos inyectados final. También me gusta la inyección dirigida por anotación, ya que simplifica mi context.xml. Puedo marcar mi constructor con @Autowired y todo funciona bien, siempre que no tenga dos parámetros del mismo tipo. Por ejemplo, tengo una clase:Spring - inyectar 2 beans del mismo tipo

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

y un contexto de aplicación con:

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

Debe haber una forma de especificar el ID de frijol en el constructor de la clase SomeClass, pero puedo' t lo encuentra en la documentación. ¿Es posible, o estoy soñando con una solución que aún no existe?

Respuesta

72

@Autowired es de tipo (en este caso); utilizar @Qualifier a Autowire por nombre, siguiendo el ejemplo from spring docs:

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

Nota: En contraste con @Autowired que es aplicable a campos, constructores y métodos multi-argumento (lo que permite reducir a través de anotaciones de clasificación en el nivel de parámetro), @Resource solo se admite para campos y métodos de establecimiento de propiedades de beans con un solo argumento. Como consecuencia, quédate con los calificadores si tu objetivo de inyección es un constructor o un método de múltiples argumentos.

(por debajo de ese texto es el ejemplo completo)

+2

'@ Autowire' es por el nombre también, pero en ese caso es necesario proporcionar fijadores. Pero aquí se prefieren los argumentos de constructor, y '@ Autowire' no funcionará si ambos argumentos son del mismo tipo. Por lo tanto, la cosa se puede resolver usando '@ Qualifier'. –

+0

aclararon la respuesta. – Bozho

+0

Aviso ....... + 1 –

Cuestiones relacionadas