Проблема с Autowiring & No unique bean

У меня есть 2 класса (B, C), которые расширяют класс 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);
  }

Но у меня есть это сообщение:

Не определено уникальное bean типа [A]]: ожидаемое однократное совпадение bean, но найдено 2: [A, B, moveModeleMarshaller]

Я действительно не могу понять, почему у меня есть это сообщение и как решить проблему даже после чтения документации Spring.

Спасибо заранее.

Ответы

Ответ 1

Вы должны переписать свой класс на что-то вроде этого с помощью аннотации @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);
  }

Вы также должны использовать аннотацию @Qualifier для экземпляра типа A, который вы создаете Spring bean в.

Что-то вроде этого:

public class Demo {

    @Autowired
    @Qualifier("a")
    private A a;

    @Autowired
    @Qualifier("b")
    private A a2;

    public void demo(..) {..}
}

Если вам не нравится иметь эту конфигурацию Spring в вашем производственном коде, вы должны написать логику инъекции зависимостей с конфигурацией XML или Java.

Вы также можете указать по умолчанию bean типа A с аннотацией @Primary над одним из ваших служебных классов, который расширяет тип A. Тогда Spring может автоушиваться без указания аннотации @Qualifier.

Так как Spring никогда не попытается угадать, какой bean для ввода, вы должны указать, какой из них или отметить один из них с помощью @Primary, если его более одного bean для типа.

Ответ 2

Вы пытаетесь (где-то еще) использовать autwire bean типа A. Что-то вроде:

@Autowired
private A beanA;

Но у вас есть 2 beans, которые соответствуют этому.

Вы можете решить эту проблему, используя @Resource и указав, какой именно bean:

@Resource("b")
private A beanA;

(где "b" - это имя введенного bean) или с помощью аннотации @Qualifier.

Ответ 3

Обычно вы получите эту ошибку, если определены два beans с тем же классом

<bean id="a" class="com.package.MyClass"/>
<bean id="b" class="com.package.MyClass"/>

если вы обратились к вышеуказанной строке, у нас есть два beans с тем же классом.

когда вы пытаетесь autwire этот класс в любом другом классе, вы получите этот тип ошибки

У вас есть два решения

Первый метод

  • используйте квалификатор, определив инициализацию id bean как это

    @Autowired
    @Qualifier("a")
    MyClass a;
    
    @Autowired
    @Qualifier("b")
    MyClass b;
    

Второй метод

используйте JSR250 api (его файл jar, который вы можете поместить в свой путь к классу

Затем выполните автоподключение, как показано ниже

@Resource("a")
MyClass a

@Resource("b")
MyClass a