Реализация принципа инверсии зависимостей с использованием Maven и Spring
Согласно этой статье в Википедии: Реализация принципа инверсии зависимости может быть осуществлена двумя способами:
- Наличие абстракции компонента низкого уровня в отдельном пакете, от которого зависят компоненты как высокого, так и низкого уровня.
- Наличие абстракции компонента низкого уровня находится в том же пакете компонента высокого уровня.
На следующем рисунке показаны зависимости до и после DIP с использованием двух подходов:
До DIP: хранилище находится в отдельном модуле maven и не имеет интерфейса, а служба напрямую зависит от реализации хранилища.
Подход 1: Представлен интерфейс (абстракция) хранилища. Реализация этого интерфейса является другим модулем, и реализация сервиса и репозитория напрямую зависит от интерфейса.
Подход 2. В этом подходе интерфейс находится в том же пакете службы. Диаграмма, используемая Фаулером для описания шаблона раздельного интерфейса, также является примером такого подхода.
Я следовал подходу 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