Внедрение Spring Bean среди двух bean-компонентов, реализующих один и тот же интерфейс - PullRequest
1 голос
/ 12 апреля 2019

У меня есть два класса Spring Bean, которые реализуют один и тот же интерфейс.

 public interface Abc()
  {
    String getNumber();
  }

Два класса

 @Service
 public class SomeClass implements abc
  {

  @Override
  public class getNumber()
  {


  }

 }


 @Service
 public class SomeClass1 implements abc
 {

  @Override
  public class getNumber()
  {

  }
  }

В моем классе обслуживания.

 @Service
 public class Demo
  {

  @Autowired
  private Abc abc;

  }

  }

Я получил ошибку "требуется один компонент, но 2 были найдены"

За эту ошибку я могу иметь возможность поместить @Primary в верхнюю часть одного из bean-компонентов.

Но у меня есть только один способ сказать «конфигурация одного компонента» на основе значения, которое я получу во время выполнения (из базы данных).

Можете ли вы предложить мне путь.

Ответы [ 3 ]

2 голосов
/ 12 апреля 2019

Пара способов автоматического подключения правильной реализации.

Измените ваше имя поля с автопроводкой на то же имя класса реализации (в верблюжьем регистре)

@Autowired
private Abc someClass;

Будет предпринята попытка найти реализацию интерфейса 'Abc' с именем класса SomeClass.

Другой способ - добавить имя компонента в аннотацию вашей службы.

@Service("someClass")
public class SomeClass implements abc

Это может быть автоматически подключено, как показано ниже

@Autowired
@Qualifier("someClass")
private Abc SomeClass;
2 голосов
/ 12 апреля 2019

Вы можете автоматически связать список интерфейсов и затем выбрать правильный. Вы можете написать:

@Autowired
List<Abc> abcs;

это приведет к списку реализаций интерфейса. В своем теле метода вы можете выбрать правильный.

0 голосов
/ 12 апреля 2019

Я думаю, что он задает вопрос о том, как настроить два внедрения, а также динамически использовать правильный компонент (на основе данных в БД). Кажется, это пример для фабричного образца

Код Psuedo

Class SomeFactory{
 @Autowired
 private Abc someClass;
  @Autowired
  private Abc someClass1;// keeping bean Name same as class name would solve bean finding issue

public Abc getBeanFor(String type) {
if("someClass".equals(type)
    return someClass;
  return someClass1;
} 
}

Class TestClass{
 @Autowired
   private SomeFactory factory ;
  private void someProcess() {
   // Read type from DB for data

   factory.getBeanFor(typeReadFromData)
                .process();
 } 
} 
...