traduccion - spring tutorial
Problema con autowiring y sin bean Ășnico (3)
Debería reescribir su clase a algo como esto con la anotación @Qualifier
.
@Service
@Qualifier("a")
public class A extends AbstratClass<Modele>{
@Autowired
A(MyClass br) {
super(br);
}
@Service
@Qualifier("b")
public class B extends A{
@Autowired
B (MyClass br) {
super(br);
}
@Service
@Qualifier("c")
public class C extends A{
@Autowired
C (MyClass br) {
super(br);
}
También debe usar la anotación @Qualifier en la instancia de tipo A en la que está conectando automáticamente el bean bean.
Algo como esto:
public class Demo {
@Autowired
@Qualifier("a")
private A a;
@Autowired
@Qualifier("b")
private A a2;
public void demo(..) {..}
}
Si no le gusta tener esta configuración de Spring en su código de producción, debe escribir la lógica de inyección de dependencia con la configuración de XML o Java.
También puede especificar un bean predeterminado de tipo A con la anotación @Primary
encima de una de sus clases de servicio que extiende el tipo A. Luego Spring puede autowire sin especificar la anotación @Qualifier
.
Como Spring nunca intentará adivinar qué bean inyectar, debe especificar cuál o marcar uno de ellos con @Primary
siempre que sea más de un bean de un tipo.
Tengo 2 clases (B, C) extiende la clase A.
@Service
public class A extends AbstratClass<Modele>{
@Autowired
A(MyClass br) {
super(br);
}
@Service
public class B extends A{
@Autowired
B (MyClass br) {
super(br);
}
@Service
public class C extends A{
@Autowired
C (MyClass br) {
super(br);
}
Pero tengo este mensaje:
No se define ningún bean único del tipo [A]: se espera un solo bean coincidente pero se encontró 2: [A, B, moveModeleMarshaller]
Realmente no puedo entender por qué tengo este mensaje y cómo resolverlo incluso después de leer la documentación de Spring.
Gracias por adelantado.
Está intentando (en otro lugar) encender automáticamente un bean de tipo A
Algo como:
@Autowired
private A beanA;
Pero tienes 2 frijoles que se ajustan a esto.
Puede resolver esto utilizando @Resource
y especificando qué bean exactamente:
@Resource("b")
private A beanA;
(donde "b" es el nombre del bean inyectado) o mediante la anotación @Qualifier
.
Generalmente obtendrá este error cuando se definan dos beans con la misma clase
<bean id="a" class="com.package.MyClass"/>
<bean id="b" class="com.package.MyClass"/>
Si aborda las dos líneas anteriores tenemos dos beans con la misma clase.
cuando intente habilitar automáticamente esta clase en cualquier otra clase, obtendrá este tipo de error
Tienes dos soluciones
Primer método
Use el calificador definiendo un ID de bean como este.
@Autowired @Qualifier("a") MyClass a; @Autowired @Qualifier("b") MyClass b;
Segundo método
use la API JSR250 (es un archivo jar que puede poner en su ruta de clase)
Entonces haz autoconducto como abajo
@Resource("a")
MyClass a
@Resource("b")
MyClass a