2014-09-06 3 views
0

Я хочу знать, как весна меняет мой метод, который имеет @transactional аннотацию на нем? , например, я прочитал here о том, как запустить транзакционный метод без использования @transactional. Какая весна в точности?Как работает @transactional?

+0

В основном Spring создает динамические прокси-классы, которые сидят вместо вашего класса и добавляют транзакционное поведение вокруг ваших методов. Документация предоставит вам все подробности: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#transaction-strategies, http://docs.spring.io/ spring/docs/current/spring-framework-reference/html/transaction.html # tx-decl-explain – geoand

+0

@geoand Просто из любопытства, почему вы отвечаете на вопрос в комментарии, а не отправляете ответ? –

+0

@ Ricardo Мне нужно написать еще несколько вещей, чтобы гарантировать реальный ответ. Я обойдусь с этим – geoand

ответ

1

Весна эффективно делает прокси для ваших объектов. Поэтому, если класс «MyApplication» вводит «DBService», а у DBService есть @Transactional, весна сделает прокси DBService. Прокси будет введен в MyApplication, и все вызовы методов DBService вместо этого вызовут этот прокси. Тогда этому прокси будет разрешено запускать транзакции или делать все, что нужно, до вызова фактического метода DBService.

MyApplication -> DBService Proxy (intercepts calls) -> DBService 

Сведения о том, как производится прокси-сервер, могут изменяться в зависимости от весенней версии и способа настройки кода. Вы можете использовать интерфейсы, позволяющие Spring сделать прокси-сервер, хотя, если вы решите не использовать интерфейсы, Spring также может расширить свой класс (используя библиотеку CGLIB. Pre 4, для этого потребовался конструктор по умолчанию, хотя в последняя весна 4 конструктор по умолчанию не требуется, и он делает это с помощью немного другого механизма)