Ejemplo
interface IA
{
public void someFunction();
}
@Resource(name="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
@Resource(name="c")
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();
}
¿Alguien puede explicarme esto?
- ¿Cómo sabe la primavera qué tipo polimórfico usar?
- ¿Necesito
@Qualifier
o@Resource
? - ¿Por qué conectamos automáticamente la interfaz y no la clase implementada?
java
spring
dependency-injection
desbordamiento de pila
fuente
fuente
Respuestas:
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).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 elname
atributo de esta anotación.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.
Su configuración de bean debería verse así:
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:Entonces
worker
enMyRunner
será inyectado con una instancia del tipoB
.fuente
@Autowired @Qualifier("a1") a;
válido?@Autowired @Qualifier("a1") A a;
También puede causar algunas advertencias en registros como Cglib2AopProxy No se puede usar el método proxy . Y aquí se describen muchas otras razones para esto ¿Por qué siempre tener interfaces de implementación única en las capas de servicio y dao?
fuente