2012-08-06 25 views
43

En la última versión de Springs, podemos autoaumentar un bean usando la anotación como @Autowired. Esto automatizará el bean usando su tipo (o constructor, si se aplica en él). ¿Hay alguna forma de que pueda utilizar la anotación @Autowired basada en el nombre del bean que estábamos haciendo sin anotación en el archivo XML de Spring como autowire = "byName"?Autocableante de bean de primavera por nombre usando la anotación

Respuesta

41

Usted puede usar JSR-250 @Resource para el autoencendido de bean de nombre propio, a menos que necesite la inyección del constructor o el método de múltiples parámetros en jection

A partir de los documentos:

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.

86

Se puede utilizar:

@Autowired 
@Qualifier("beanname") 

Según el @Qualifier javadoc

Esta anotación se puede utilizar en un campo o parámetro como un partido de clasificación para los granos de candidatos cuando Autowiring

+1

Great find. No fue obvio – ATrubka

+1

¿No debería ser '@ Autowired' en lugar de' @ Autowire'? – user3114157

1

Estaba usando el proxy de nombre de bean que estaba estropeando el autoenvío por su nombre. @Resource no tenía ese problema ya que no le importa el tipo. Así que ahora sé una razón para esta recomendación de los desarrolladores de Spring :-) Solo FYI

+0

Se menciona otra razón más en los documentos de Spring: ... los beans que se definen a sí mismos como una colección o tipo de mapa no se pueden inyectar a través de @Autowired, porque la coincidencia de tipos no es adecuada para ellos. – rwitzel

2

Si desea definir el nombre del bean con el que se registrarán en el contenedor DI, puede pasar el nombre en la propia anotación, p. @Service ("employeeManager").

A continuación, mediante el siguiente código puede activar Autowire por Nombre

uso
@Autowired 
@Qualifier("employeeManager") 
private EmployeeManagerService employeeManagerService; 
1

Uso @Component ("beanName") en la definición de la clase Java del frijol

Entonces, mientras Autowiring JSR 330

@Inject @Named (Value = "beanname")

Cuestiones relacionadas