Этого не должно быть.То, что я обычно делаю, имеет такую структуру модуля:
root
- api (interfaces, enums and custom exceptions only)
- impl (standard implementation of api -> dependency to api)
- server (runtime dependency to impl, compile time to api only)
- client (dependency to api only)
Допустим, у нас есть интерфейс Person
в модуле api
.Теперь в модуле impl
у вас будет класс JpaPerson
, потому что impl
использует JPA.Однако это детали, которые не нужны клиенту и серверу сейчас, поэтому вы не должны (и в моем дизайне не можете) сделать new JpaPerson()
в client
или server
.Вместо этого у вас будет интерфейс (также внутри api
) с именем PersonFactory
(звучит ужасно, когда вы говорите о людях, возможно, назовите его более удобным для человека), который имеет такие методы:
public interface PersonFactory{
Person findPersonBySsn(String socialSecurityNumber);
List<Person> findPersonsByName(String firstName, String lastName);
List<Person> findPersonByBirthDate(Date birthDate);
Person createPerson(
String firstName, String lastName,
Date birthDate, String socialSecurityNumber
);
}
Опять же, реализуйте этот интерфейс в модуле impl
, но упоминайте его как интерфейс только в других модулях.Затем используйте внедрение зависимостей , чтобы соединить все вместе (Spring, SEAM, EJB3 и т. Д.).
Ситуация, о которой вы упоминаете, является результатом того, что код выполняет то, что находится вне его ответственности (читайте о разделение интересов ).
Большим преимуществом этой конструкции является то, что вы можете выполнить рефакторинг всех модулей (кроме api
) по отдельности, без изменения кода в других модулях.Поэтому, если вы хотите перейти с jpa на классический hibernate, вам просто нужно отредактировать impl
.Если вы хотите переключить сервер с оси на cxf, просто измените server
.Это делает вещи намного проще.И, конечно, вы не получаете циклические зависимости.
РЕДАКТИРОВАТЬ:
простое (более простое) решение для вас будет ввести модуль d, который включен в качестве зависимости ва, б и в.Переместить весь общий код в d.(На самом деле переименуйте этот d в a и a, b, c в b, c, d).