Фасад, сервисные интерфейсы и транзакционные прокси с Spring - PullRequest
1 голос
/ 31 марта 2011

Ситуация

Существует высокая вероятность того, что пользователи не будут напрямую взаимодействовать с различными объектами службы (POJO или сессионными компонентами), поскольку при использовании шаблона фасада собираются разные отдельные службыв одну кучу.

Аннотация @Transactional применяется на уровне методов отдельных служб, а не на методах Фасада.

Это решает практическую проблему - если службы не имеют интерфейсаSpring не может использовать для них хорошие прокси-серверы транзакций, что приводит к различным сложностям.

Вопрос

Какая практика нужна?

  • Создание отдельных сервисных интерфейсов ради хороших прокси,
  • или перемещение аннотаций @Transactional в методы Facade (при этом внутреннее использование сервисов также должно проходить через Facadeдля обеспечения транзакций).
  • или еще?

Каков ваш опыт работы на местах?Я также открыт для размышлений в более широкой перспективе.

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Если у службы нет интерфейсов, Spring по-прежнему может применять к ней транзакционный аспект, используя CGLIB прокси , в большинстве случаев он работает нормально.Реальные проблемы возникают, когда сервис имеет некоторые интерфейсы, но транзакционный метод не является частью этих интерфейсов.

Однако применение @Transactional к методам Facade может быть более чистым решением, поскольку интерфейс Facade определяет четкие границы транзакций.Если в этом случае вы беспокоитесь об использовании сервисов без Facade, вы можете применить @Transactional к сервисам, а также к методам Facade.В этих случаях транзакции, созданные при вызове методов Facade, распространяются на сервисные методы.

1 голос
/ 04 апреля 2011

Единственными критериями для размещения границ транзакции должны быть критерии бизнес-логики, а не технические проблемы.Если методы служб должны быть атомарными операциями, тогда управляйте транзакциями там.Если ваш фасад может объединять 2 или более вызовов службы, и они должны быть «исполнять все или ничего», это означает, что транзакция должна быть помещена в фасад.Как упоминалось в axtavt, прокси cglib можно использовать для прокси-классов без интерфейсов.

Я также рекомендую эту серию Марка Ричардса: http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=transaction+strategies:

...