Главная » Spring » Определение  транзакций с помощью аннотаций Spring

0

Применение элемента <tx:advice> позволяет значительно упрос- тить объявление транзакций в конфигурационных XML-файлах Spring. А что, если я скажу, что можно добиться еще большего упро- щения? Что, если я скажу, что достаточно добавить в определение контекста приложения всего одну строку, чтобы обеспечить объяв- ление транзакций?

Помимо элемента <tx:advice>, пространство имен tx содержит так- же элемент <tx:annotation-driven>. Чтобы воспользоваться им, доста- точно добавить в XML-файл всего одну строку:

<tx:annotation-driven />

И все! Если вы ожидали большего, приношу свои извинения. Чтобы сделать пример немного интереснее, можно добавить опре- деление компонента диспетчера транзакций с помощью атрибута

transactionmanager  (который по умолчанию ссылается на компонент с идентификатором transactionManager):

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

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

Аннотации – одна из самых крупных и самых обсуждаемых осо- бенностей Java 5. Аннотации позволяют добавлять метаданные не- посредственно в программный код, а не во внешние конфигурацион- ные файлы. Я полагаю, что они прекрасно подходят для объявления транзакций.

Элемент <tx:annotation-driven> сообщает фреймворку Spring про- верить все компоненты в контексте приложения и отыскать отмечен- ные аннотацией @Transactional на уровне определения класса или на уровне методов. К каждому компоненту с аннотацией @Transactional элемент <tx:annotation-driven> автоматически применит совет с опре- делением транзакции. Атрибуты транзакции в этом случае опреде- ляются параметрами аннотации @Transactional.

Например, в листинге 7.3 демонстрируется объявление класса

SpitterServiceImpl, дополненное аннотациями @Transactional.

Листинг 7.3. Добавление транзакций в службу Spitter

@Transactional(propagation=Propagation.SUPPORTS,     readOnly=true) public  class  SpitterServiceImpl  implements  SpitterService  {

}

@Transactional(propagation=Propagation.REQUIRED,     readOnly=false) public   void   addSpitter(Spitter   spitter)   {

}

Аннотация @Transactional на уровне определения класса Spitter- ServiceImpl сообщает, что все его методы поддерживают возможность выполнения в рамках транзакций, выполняющихся в режиме «толь- ко для чтения». А аннотация на уровне метода saveSpittle() сооб- щает, что этот метод обязательно должен выполняться в контексте транзакции.

В заключение

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

Фреймворк Spring поддерживает и программное, и декларативное управление транзакциями. В обоих случаях Spring ограждает вас от необходимости работать непосредственно с конкретными механиз- мами управления транзакциями, скрывая конкретные реализации за универсальным API.

Для поддержки декларативного управления транзакциями Spring использует собственный фреймворк AOP. Декларативные транзак- ции в Spring обладают теми же возможностями, что и конкурирую- щая платформа EJB CMT, позволяя определять не только правила распространения в POJO, но также уровень изоляции, задействовать оптимизации, подразумеваемые режимом доступа «только для чте- ния», и правила отмены в ответ на конкретные исключения.

Эта глава продемонстрировала, как применять декларативные транзакции с использованием аннотаций модели программирования Java 5. С введением аннотаций в Java 5, чтобы обеспечить выпол- нение метода в рамках транзакции, достаточно просто пометить его соответствующей аннотацией.

Как было показано выше, Spring распространяет мощь деклара- тивных транзакций на POJO. Это самое захватывающее нововве- дение, так как прежде декларативные транзакции были доступны только в EJB. Но декларативные транзакции – это лишь верхушка айсберга из всего того, что Spring может предложить для работы с POJO. В следующей главе будет показано, как Spring распростра- няет на POJO декларативную поддержку безопасности.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии