В 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. В зависимости от того, как вы реализуете, я должен работать, но ваш код должен использовать исключение как если бы.
Привет