Supongamos que tengo interfaces como estas:
interface Country {}
class USA implements Country {}
class UK implements Country ()
Y este fragmento de configuración xml:
<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>
¿Cómo puedo controlar qué dependencia se conecta automáticamente a continuación? Me gustaría el del Reino Unido.
class Main {
private Country country;
@Autowired
public void setCountry(Country country) {
this.country = country;
}
}
Estoy usando Spring 3.0.3.RELEASE.
Respuestas:
Esto está documentado en la sección 3.9.3 del manual Spring 3.0:
En otras palabras, el comportamiento predeterminado es como si lo hubiera agregado
@Qualifier("country")
al método de establecimiento.fuente
country
)Puede usar la anotación @Qualifier
Desde aqui
Ajuste del cableado automático basado en anotaciones con calificadores
Dado que el cableado automático por tipo puede conducir a múltiples 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 tipos para que se elija un bean específico para cada argumento. En el caso más simple, este puede ser un valor descriptivo simple:
Esto usará el Reino Unido para agregar una identificación al bean de EE. UU. Y usarlo si desea EE. UU.
fuente
Otra forma de lograr el mismo resultado es usar la anotación @Value:
En este caso, la
"#{country}
cadena es una expresión de Spring Expression Language (SpEL) que se evalúa como un bean llamadocountry
.fuente
Una solución más con la resolución por nombre:
Utiliza el paquete javax.annotation , por lo que no es específico de Spring, pero Spring lo admite.
fuente
@Resource
no estará listo para usar con java 11 debido a los módulos de rompecabezasen algún caso, puede usar la anotación @Primary.
De esta manera se seleccionará como el candidato de autowire predeterminado, sin necesidad de autowire-candidato en el otro bean.
para obtener más detalles, consulte Autowiring two beans implementando la misma interfaz: ¿cómo configurar el bean predeterminado en autowire?
fuente