Could not autowire. There is more than one bean of 'MessageChain' type
Всем привет, столкнулся с такой проблемой, хотел заимплементировать максимально несвязанную цепь обязаностей через Spring. Идея заключалась в том, чтобы в конфигурации передавать абстрактный класс и автоматически привязывать следующую цепь, если она существует, если её нет, чтобы просто передавалось значение null.
Столкнулся с проблемой - Could not autowire. There is more than one bean of 'MessageChain' type.
Как видно на скриншоте, в первом случае, spring просит квалифицировать бин либо указать его явно, как я сделал с secondChain.
Вопрос следующий, выйдет ли через спринг сделать настолько неявную привязку? Мне это нужно для того, чтобы при создании новой цепочки не прописывать её в предыдущей а просто дописать в конфиг. Если нет, подскажите пожалуйста возможные способы решения этой проблемы.
Ответы (2 шт):
Кажется, тебе нужно иметь несколько реализаций одного интерфейса в контекте.
Для этого ты можешь объявить несколько компонентов одного типа (MessageChain)
@Bean
public static MessageChain messageChain1(){...}
@Bean
public static MessageChain messageChain2(){...}
@Bean
public static MessageChain messageChain3(){...}
, а затем инжектить их сразу списком.
@Autowired
private List<MessageChain> messageChains;
Я вижу, что тебе нужно, чтобы chain-ы были в определенном порядке. Для этого ты можешь отнаследовать MessageChain от интерфейса Ordered. Тогда Spring автоматически отсортирует все chain-ы по значению метода getOrder()
Удачи!
И так, путём махинаций и различных тестов я нашёл оптимальное решение для своего случая,прилагаю скриншот

Мы можем создать очередь и тянуть из неё элементы, метод poll()
позволит нам не словить нал поинтер а просто вставить налл, если в очереди нету элементов нашей цепи, что будет актуально для первой цепи, так как в очереди не будет элементов. В дальнейшем с помощью метода element() мы сможем вытянуть первую цепочку для конфигурации остальных модулей.
