правильный способ ввести несколько реализаций с помощью пружины - PullRequest
0 голосов
/ 28 июня 2019

У меня есть class A, в котором есть поле ADep (Зависимость А).Теперь aDep имеет два типа реализаций, скажем typeA impls и typeB impls.Я хочу использовать typeB, когда выдается конкретное исключение при использовании typeA.Я использую пружину для внедрения зависимости.

Я могу придумать 3 способа:

  1. Я определяю еще одно поле aDep и внедряю в него любую реализацию typeB (см. Класс ниже).Проблема в том, что любой может инициализировать это поле с помощью любых typeA реализаций, и я предполагаю, что в этом поле используется поведение typeB.
class A {
    ADep aDepI1;//only typeA impls
    ADep aDepI2;//only typeB impls
}

A имеет только одно поле, и я использую фабрику бобов Spring, чтобы получить typeB impl в моем классе, если при использовании typeA.

я создаю2 экземпляра A, использующих пружину, один с typeA и один с typeB, а пользователи A должны сначала использовать typeA, и, если выброшено исключение, снова вызвать typeB instance.

Я думаю, что третье решение будет лучшим.Что вы думаете, любая помощь приветствуется?

1 Ответ

0 голосов
/ 28 июня 2019

В Java 8 и выше вы можете сделать что-то вроде

public interface IMyInterface{}

public class ClassA implements IMyInterface{}

public class ClassB implements IMyInterface{}

Тогда вы могли бы сделать что-то вроде этого (обратите внимание, этот код не является копией / вставкой, просто примите идею)

public class SomeClient{
    @Autowired List<IMyInterface> myInterfaceImps;

   public IMyInterface obtainImplementation(Some inputData)
   {
    return myInterfaceImps.stream().filter(c->somePredicate(c,inputData))
    .findFirst()
    .orElse(defineHereDefaulBehaviour());
   }

 }

Затем, используя подобное, вы можете автоматически подключить класс SomeClient для получения нужного значения

Другой способ - сделать это с помощью @Qualifiers и ServiceLocatorFactoryBean

Я просто хотел бы добавить, что похоже, что вы используете исключения как операторы, и это запах кода. Решение, которым я делюсь, заключается в том, как извлечь разные bean-компоненты в зависимости от некоторого условия, определенного в функции предиката, или, если в зависимости от «чего-то», вы можете получить сам bean-компонент с помощью ServiceLocator. В зависимости от того, как вы реализуете, я должен работать, но ваш код должен использовать исключение как если бы.

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...