2011-01-10 9 views
24

Tengo varios frijoles con el mismo tipo (BeanType). ¿Cómo los inyecté por ID con una anotación? Di:¿Cómo puedo inyectar una dependencia de Spring por ID?

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

Pero no hay ninguna anotación @ID.

Solo encontré @Qualifier lo que significaría que tendría que dar todos mis ID de frijoles y calificadores. Sin duda, hay una manera más simple?

solución

Respuesta

60

simple es utilizar @Resource

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

Incidentalmente, @Qualifierse usa para referirse a los granos por ID para su uso con @Autowired, por ejemplo

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

donde bean1 es el ID de la frijol para ser inyectado.

Véase el Spring manual:

Para un partido de reserva, el nombre de frijol se considera un valor calificador por omisión. Por lo tanto, puede definir el bean con un id "principal" en lugar del elemento calificador anidado, lo que lleva al mismo resultado coincidente. Sin embargo, aunque puede utilizar esta convención para referirse a beans específicos por su nombre, @Autowired es fundamentalmente una inyección basada en el tipo con calificadores semánticos opcionales. Esto significa que los valores de calificador, incluso con el retorno de nombre de bean, siempre tienen una semántica de estrechamiento dentro del conjunto de coincidencias de tipo; no expresan semánticamente una referencia a una identificación de frijol única.

y

Si tiene la intención de expresar la inyección de anotación impulsada por su nombre, no utilizan principalmente @Autowired, incluso si es técnicamente capaz de referirse a un nombre de frijol a través @Qualifier valores. En su lugar, use la anotación JSR-250 @Resource, que está semánticamente definida para identificar un componente objetivo específico por su nombre único, con el tipo declarado como irrelevante para el proceso de coincidencia.

Prefiero @Resource, es más limpio (y no específico de Spring).

+0

Hmm ... entonces debo haber hecho algo mal porque @Qualifier no encuentra frijoles ... aunque funciona '@ Resource'. ¿Puedes verificar que '@ Qualifier' realmente funcione para IDs? Según los documentos, necesita un elemento '' en el bean. –

+2

@ Aaron: El comportamiento de cada enfoque es realmente sutilmente diferente. Cuando se usa '@ Qualifier' con' @ Autowired', el calificador se usa para restringir las opciones presentadas por '@ Autowired', mientras que' @ Resource' selecciona explícitamente un bean por su nombre. – skaffman

+0

@ Aaron: ver edición – skaffman

Cuestiones relacionadas