¿Cómo sabe la primavera qué tipo polimórfico usar?
Siempre y cuando solo haya una implementación única de la interfaz y esa implementación esté anotada con @Component
el escaneo de componentes de Spring habilitado, Spring Framework puede encontrar el par (interfaz, implementación). Si la exploración de componentes no está habilitada, debe definir el bean explícitamente en su application-config.xml (o un archivo de configuración de resorte equivalente).
¿Necesito @Qualifier o @Resource?
Una vez que tenga más de una implementación, deberá calificar cada una de ellas y, durante el cableado automático, deberá usar la @Qualifier
anotación para inyectar la implementación correcta, junto con la @Autowired
anotación. Si está utilizando @Resource (semántica J2EE), debe especificar el nombre del bean utilizando el name
atributo de esta anotación.
¿Por qué conectamos automáticamente la interfaz y no la clase implementada?
En primer lugar, siempre es una buena práctica codificar interfaces en general. En segundo lugar, en caso de primavera, puede inyectar cualquier implementación en tiempo de ejecución. Un caso de uso típico es inyectar una implementación simulada durante la etapa de prueba.
interface IA
{
public void someFunction();
}
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
....
worker.someFunction();
}
Su configuración de bean debería verse así:
<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />
Alternativamente, si habilitó la exploración de componentes en el paquete donde están presentes, entonces debe calificar cada clase de la @Component
siguiente manera:
interface IA
{
public void someFunction();
}
@Component(value="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
@Component(value="c")
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
@Component
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
....
worker.someFunction();
}
Entonces worker
en MyRunner
será inyectado con una instancia del tipo B
.