2010-12-15 9 views
77

Supongamos que tengo interfaces, tales como las siguientes:¿Cómo se conecta AutoWire por su nombre cuando se encuentra más de un bean coincidente?

interface Country {} 
class USA implements Country {} 
class UK implements Country() 

Y este fragmento de XML de configuración:

<bean class="USA"/> 
<bean id="country" class="UK"/> 
<bean id="main" class="Main"/> 

¿Cómo puedo controlar lo que la dependencia se autowired abajo? Me gustaría el Reino Unido.

class Main { 
    private Country country; 
    @Autowired 
    public void setCountry(Country country) { 
     this.country = country; 
    } 
} 

Estoy usando Spring 3.0.3.RELEASE.

+0

Pensé en agregar que estaba obteniendo un "No unique bean of type ..."en un entorno (de prueba) y funcionó bien en mi entorno de desarrollo. Estoy seguro de que fue una especie de classpath, pero resultó que, si agrega @Qualifier, funcionó bien. – markthegrea

Respuesta

87

Esto está documentado en el manual de section 3.9.3 Spring 3.0:

Para un partido de reserva, el nombre de frijol se considera un valor calificador por omisión.

En otras palabras, el comportamiento predeterminado es como si hubiera agregado @Qualifier("country") al método setter.

49

Puede utilizar la anotación @Qualifier

De here

Puesta a punto autowiring basada en anotación con los calificadores

Desde Autowiring por tipo puede conducir a varios candidatos, a menudo es necesario tener más control sobre el proceso de selección. Una forma de lograr esto es con la anotación @Qualifier de Spring. Esto permite asociar valores de calificador con argumentos específicos, reduciendo el conjunto de coincidencias de tipo para que se elija un bean específico para cada argumento. En el caso más simple, esto puede ser un valor descriptivo sencillo:

class Main { 
    private Country country; 
    @Autowired 
    @Qualifier("country") 
    public void setCountry(Country country) { 
     this.country = country; 
    } 
} 

Esto utilizará el Reino Unido añadir un id de EE.UU. frijol y el uso que si desea que el EE.UU..

8

Otra forma de lograr el mismo resultado es el uso de la anotación @Valor:

public class Main { 
    private Country country; 

    @Autowired 
    public void setCountry(@Value("#{country}") Country country) { 
      this.country = country; 
    } 
} 

En este caso, la cadena "#{country} es una expresión Spring Expression Language (SpEL) que evalúa a un bean llamado country.

+0

se puede inyectar en función de la propiedad ? ¿Qué pasa si EE. UU. o el Reino Unido es algún tipo de parámetro procedente de URL y quiero inyectar 2 cosas diferentes en función de lo que es el parámetro? –

5

Una solución con más resolver por su nombre:

@Resource(name="country") 

Se utiliza javax.annotation paquete, por lo que no es primavera específico, pero la primavera es compatible con ella.

Cuestiones relacionadas