Циклическая зависимость в Spring инъекции — это плохой дизайн?

Я застрял со следующей проблемой:

Я пытаюсь создать bean-компоненты следующим образом:

@Bean
public abc createABC() {
    return new ABC(--, def(),--);
}

`

@Bean
public DEF def() {
    return new DEF(--, createABC(),--
}

Любые предложения, чтобы обойти эту проблему, не переходя на инъекцию на основе сеттера. Является ли это показателем плохой конструкции? В моей ситуации эта зависимость обязательна. Пожалуйста, выскажите свое мнение по этому поводу


person user3681970    schedule 26.01.2017    source источник
comment
Выход - инъекция на основе сеттера. В конце дня вы должны создавать один компонент за другим. Что бы вы ни создали первым, другое не может быть передано в вызове конструктора.   -  person Henry    schedule 26.01.2017
comment
@Jim Garrison ОП также хочет знать, плохой ли это дизайн. Можете ли вы указать мне ответ в дубликате, который объясняет, свидетельствует ли это о плохом дизайне? Хотя в этом вопросе говорится о весенних и циклических зависимостях, он не является дубликатом, поскольку ОП четко заявляет, что он не хочет прибегать к инъекциям на основе сеттера. Можете ли вы пересмотреть вето на закрытие вопроса?   -  person CKing    schedule 26.01.2017
comment
Вы должны использовать инъекцию на основе установки, поскольку вы должны сначала создать объекты, а затем внедрить ссылки на взаимные зависимости. Это невозможно сделать во время строительства.   -  person Jim Garrison    schedule 26.01.2017
comment
@JimGarrison Есть и другие варианты. Всегда можно реорганизовать классы, чтобы удалить циклическую зависимость. ОП открыт для изменения дизайна классов, потому что он хочет знать, плохой ли это дизайн. Я не понимаю, как это дубликат?   -  person CKing    schedule 26.01.2017
comment
Спасибо всем за участие! Я рефакторинг нескольких фрагментов кода, которые помогут не создавать такую ​​​​зависимость. Я считаю это показателем плохого дизайна (открыт для обсуждения). Поскольку у каждого класса должны быть хорошо продуманные обязанности, в идеальном мире такая ситуация не должна возникать.   -  person user3681970    schedule 26.01.2017
comment
Вы можете проголосовать за возобновление работы. Спросите в Meta Stack Overflow, и, если достаточное количество людей согласится, он будет снова открыт.   -  person Jim Garrison    schedule 26.01.2017
comment
@JimGarrison Ну, я всегда могу это сделать, но я определенно прошу вас подумать об этом и снова открыть. Я не считаю, что требуется полноценный уличный марш / восстание, поскольку из приведенного выше комментария ОП видно, что это другой вопрос. Я не знаю, почему вы думаете иначе?   -  person CKing    schedule 26.01.2017
comment
Некоторые ссылки на циклические зависимости: stackoverflow.com /вопросы/37444940/   -  person jaco0646    schedule 26.01.2017


Ответы (1)


это показатель плохой конструкции?

Абсолютно. Если ABC зависит от DEF, а DEF зависит от ABC, это косвенно означает, что ваш код организован неправильно. Такие циклические зависимости обычно указывают на то, что вы не придерживаетесь принципа единой ответственности.

ABC имеет логику, которая должна быть у DEF, и наоборот. Вы должны реорганизовать эти классы так, чтобы либо ABC зависело от DEF, либо DEF зависело от ABC, но не от того и другого одновременно.

person CKing    schedule 26.01.2017
comment
Я не уверен, что это всегда свидетельствует о плохом дизайне. В моем случае у меня есть 2 службы A и B. A зависит от B, а B зависит от A. Они вводятся друг в друга. Оба имеют метод update. Причина, по которой мне нужна такая настройка, заключается в том, что когда я вызываю A.update(), я хочу, чтобы B.update() также вызывался, и наоборот. Как это плохой дизайн? - person IonutB; 10.08.2019
comment
Почему бы не создать класс для составления этих вызовов, а не связывать методы обновления друг с другом? Зачем вообще иметь отдельные обновления A и B, если они должны произойти оба, почему бы не иметь службу обновления, которая принимает a и b и имеет метод обновления? - person Darren Forsythe; 10.08.2019