Подтвердить что ты не робот

Где поставить @Transactional? В спецификации интерфейса или реализации?

Что считается лучшей практикой при размещении аннотации @Transactional? Должен ли я комментировать метод интерфейса или реализацию?

4b9b3361

Ответ 1

Хороший вопрос. Я всегда делал это в реализации. Возможно, потому, что это детализация реализации, а не абстракция.

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

Эль Гуапо отметил, что в дополнение к этому есть больше проблем, которые могут возникнуть в результате использования интерфейса, связанного с стратегией проксирования.

Ответ 2

На самом деле все зависит от вашей архитектуры приложения, на мой взгляд. Это зависит от того, как вы проксируете свои классы. Если ваше приложение установлено на proxy-target-class='true' (в контексте вашего приложения, ваша информация @Transactional не будет получена, если вы аннотируете интерфейс.

Подробнее о Spring Docs - "Советы" .

Spring рекомендует только аннотировать конкретные классы (и методы конкретных классов) с аннотацией @Transactional, а не аннотировать интерфейсы. Вы, конечно, можете поместить аннотацию @Transactional на интерфейс (или метод интерфейса), но это работает только так, как вы ожидали бы, если вы используете прокси на основе интерфейса. Тот факт, что аннотации Java не унаследованы от интерфейсов, означает, что если вы используете прокси-классы на основе класса (proxy-target- class= "true" ) или аспект на основе ткачества (mode = "aspectj" ), то настройки транзакции не распознаются инфраструктурой проксирования и ткачества, и объект не будет обернут в транзакционный прокси, что будет явно плохо.

Ответ 3

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

Ответ 4

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

Я не думаю, что все классы должны иметь интерфейсы. Я вижу вокруг много архитектур с большим количеством шаблонов, и они все любят интерфейсы. Но вопрос: если вы помещаете аннотацию Spring в интерфейс, и по какой-то причине вам нужен другой подход к транзакции класса реализации, выполненный над этим интерфейсом, вы не могли этого сделать. Или я не прав?

Приветствия.