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

Spring: менеджер транзакций, управляемый аннотациями

Я создаю новый проект JPA + Spring. В чем разница (для меня как программиста) между:

<tx:annotation-driven transaction-manager="transactionManager" />

и

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />

в моем приложенииContext.xml?

4b9b3361

Ответ 1

Существует огромная разница между аспектами прокси и байтов кода. Прокси могут только перехватывать, если вызов происходит из "внешнего пространства", но не если вызов происходит от самого объекта (this.transactionalMethod())

Это означает, что если у вас есть класс с двумя методами, T и B. Метод T имеет аннотацию транзакции, а метод B вызывает T на "this.T() ", тогда прокси никогда не вызывается (для T), поэтому в этом случае транзакции не обрабатываются!

Если вы используете AspectJ, код обработки транзакций является небрежным в байтовом коде T, и он будет выполняться независимо от того, вызван ли вызов из самого объекта или из другого объекта.

Ответ 2

Документы говорят:

Режим "прокси" по умолчанию обрабатывает аннотированный beans для проксирования с использованием инфраструктуры Spring AOP (после семантики прокси, как обсуждалось выше, применительно к вызовам методов, поступающим только через прокси). Альтернативный режим "aspectj" вместо этого перетаскивает затронутые классы с помощью аспекта транзакции Spring AspectJ, изменяя код байта целевого класса для применения к любому вызову метода. Для переплетения AspectJ требуется spring -aspects.jar в пути к классам, а также вождение во время загрузки (или компиляция во времени). (См. Раздел 7.8.4.5, "Spring конфигурация" для получения подробной информации о том, как настроить загрузку во времени).

Не имеет значения (с точки зрения разработчика), какой режим будет использоваться.