Реализация принципа инверсии зависимостей с использованием Maven и Spring

Согласно этой статье в Википедии: Реализация принципа инверсии зависимости может быть осуществлена ​​двумя способами:

  • Наличие абстракции компонента низкого уровня в отдельном пакете, от которого зависят компоненты как высокого, так и низкого уровня.
  • Наличие абстракции компонента низкого уровня находится в том же пакете компонента высокого уровня.

На следующем рисунке показаны зависимости до и после DIP с использованием двух подходов:

До DIP: хранилище находится в отдельном модуле maven и не имеет интерфейса, а служба напрямую зависит от реализации хранилища. Зависимости перед DIP

Подход 1: Представлен интерфейс (абстракция) хранилища. Реализация этого интерфейса является другим модулем, и реализация сервиса и репозитория напрямую зависит от интерфейса. Подход внедрения DIP 1

Подход 2. В этом подходе интерфейс находится в том же пакете службы. Диаграмма, используемая Фаулером для описания шаблона раздельного интерфейса, также является примером такого подхода. Подход внедрения DIP 1

Я следовал подходу 1 и, поскольку я использовал JavaConfig от Spring, модуль служб должен был иметь зависимость maven как от интерфейсов инфраструктуры, так и от модулей реализации. Помимо моего @Configuration файл, там нет абсолютно никакой ссылки на какую-либо конкретную реализацию инфраструктуры.

В настоящее время я думаю о переходе на Approach2, но, очевидно, он не будет работать с JavaConfig, так как я получу прямые ссылки в коде на модуль реализации интерфейса, что приведет к циклической зависимости, с чем не справятся такие инструменты сборки, как maven,

Вопрос в том, как можно настроить Spring и Maven для достижения подхода 2? Есть ли способ попросить Spring сканировать компоненты, которые не добавлены в зависимости от maven? Это потребует изменений в способе, которым я использую maven?

1 ответ

У меня был такой же запрос. Очень поздний ответ, но это то, что я придумал для проекта XYZ (сплющенный стиль maven):

      xyz-service1
    src/main/java/com/example/xyz/service1/Service1.java
xyz-service1-repository1
    src/main/java/com/example/xyz/service1/repository1/Repository1.java (interface)
xyz-file-repository
    src/main/java/com/example/xyz/file-repository/FileRepository.java
    src/main/java/com/example/xyz/file-repository/Repository1Adapter.java
xyz
    src/main/java/com/example/xyz/XyzJavaConfig.java
    src/main/assembly/xyz.bin

Дерево зависимостей:

      xyz
    xyz-service1
        xyz-service1-repository1
    xyz-file-repository
        xyz-service1-repository1
Другие вопросы по тегам