Spring: менеджер транзакций, управляемый аннотациями
Я создаю новый проект JPA + Spring. В чем разница (для меня как программиста) между:
<tx:annotation-driven transaction-manager="transactionManager" />
и
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
в моем приложенииContext.xml?
Ответы
Ответ 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 конфигурация" для получения подробной информации о том, как настроить загрузку во времени).
Не имеет значения (с точки зрения разработчика), какой режим будет использоваться.