Устранение циклических зависимостей в приложении Spring Boot - PullRequest
0 голосов
/ 19 июня 2020

Я продолжаю изучать Spring Boot и столкнулся с проблемой циклических зависимостей. У меня есть бот со следующей структурой:

enter image description here

жирный font = class, @Component; Красный полужирный = @ Внедрение зависимостей (все через конструкторы)

Я получу обновление от пользователя, затем это обновление перейдет к основному обработчику (UpdateReceiver) и т.д. c. Я вижу, что мне нужен компонент Bot почти везде (для отправки сообщений), но для бота требуется UpdateReceiver, потому что я не хочу обрабатывать обновление в основном классе, просто перенаправьте его:

@Override
    public void onUpdateReceived(Update update) {
        //log
        updateReceiver.handleUpdate(update);
    }

Итак, цикл зависимости. Как я могу решить этот случай? Спасибо!

ОБНОВЛЕНИЕ

Класс бота:

@Component
@Log4j2
public class AssistantBot extends TelegramLongPollingBot {

    ...

    private UpdateReceiver updateReceiver;

    public AssistantBot(UpdateReceiver updateReceiver) {
        this.updateReceiver = updateReceiver;
    }

    @Override
    public void onUpdateReceived(Update update) {
        updateReceiver.handleUpdate(update);
    }

    ...

    public synchronized void sendTextMessage(long chatId, String message) {
        SendMessage textMessage = new SendMessage()
                .enableMarkdown(false)
                .setChatId(chatId)
                .setText(message);
        try {
            execute(textMessage);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
...
other methods to send messages

UpdateReceiver:

@Service
public class UpdateReceiver {

    private TextMessageHandler textMessageHandler;
    private CallbackQueryHandler callbackQueryHandler;
    private AssistantBot bot;


    public UpdateReceiver(TextMessageHandler textMessageHandler,
                          CallbackQueryHandler callbackQueryHandler,
                          AssistantBot bot){
        this.textMessageHandler = textMessageHandler;
        this.callbackQueryHandler = callbackQueryHandler;
        this.bot = bot;
    }

    public void handleUpdate(Update update) {
        if (update.hasMessage() && update.getMessage().hasText()){
            textMessageHandler.handleTextMessage(update);
        }
        else if (update.hasCallbackQuery()) {
            callbackQueryHandler.handleCallbackQuery(update.getCallbackQuery());
        }
        else {
            bot.sendTextMessage(update.getMessage().getChatId(),
                    "I can't handle this!");
        }
    }
}
...