Инструкция по созданию бизнесобъектов. Strategy это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми
Скачать 0.73 Mb.
|
21.1. EntityManager proxy? Почему рекомендуется использовать аннотации?Например, когда происходит вызов метода entityManager.persist(), он не вызывается напрямую у EntityManager. Вместо этого вызывается прокси, который достает текущий EntityManager из потока, в который его положил менеджер транзакций. Подход через аннотации намного удобен и удобочитаем и поэтому рекомендуется использовать именно его. 21.2. Как @Transactional парсится и что Spring с ней делает?У Spring есть специальный парсер для этого – SpringTransactionAnnotationParser (используется по умолчанию). SpringTransactionAnnotationParser – это реализация стратегии для разбора аннотации Spring Transactional. Находится в пакете: java.lang.Objectorg.springframework.transaction.annotation 21.3. Значения параметра Propagation?1. REQUIRED – применяется по умолчанию. При входе в @Transactional метод будет использована уже существующая транзакция или создана новая транзакция, если никакой еще нет. 2. REQUIRES_NEW – новая транзакция всегда создается при входе метод, ранее созданные транзакции приостанавливаются до момента возврата из метода. 3. NESTED – корректно работает только с базами данных, которые умеют устанавливать savepoints. При входе в метод в уже существующей транзакции создается savepoint, который по результатам выполнения метода будет либо сохранен, либо отменен. Все изменения, внесенные методом, подтвердятся только позднее с подтверждением всей транзакции. Если текущей транзакции не существует, будет создана новая. Savepoint – устанавливает новую точку сохранения в текущей транзакции. Точка сохранения — это специальная отметка внутри транзакции, которая позволяет откатить все команды, выполненные после нее, и восстановить таким образом состояние на момент установки этой точки. 4. MANDATORY – всегда используется существующая транзакция и кидается исключение, если текущей транзакции нет. 5. SUPPORTS – метод будет использовать текущую транзакцию, если она есть, либо будет исполнятся без транзакции, если ее нет. 6. NOT_SUPPORTED – при входе в метод текущая транзакция, если она есть, будет приостановлена, и метод будет выполняться без транзакции. 7. NEVER – явно запрещает исполнение в контексте транзакции. Если при входе в метод будет существовать транзакция, будет выброшено исключение. 21.4. Другие параметры @Transaction?1. rollbackFor = Exception.class – если какой-либо метод выбрасывает указанное исключение, контейнер всегда откатывает текущую транзакцию. По умолчанию отлавливает RuntimeException; 2. noRollbackFor = Exception.class – указание того, что любое исключение, кроме заданного, должно приводить к откату транзакции; 3. rollbackForClassName и noRollbackForClassName – для задания имен исключений в строковом виде; 4. readOnly – разрешает только операции чтения. В свойстве transactionManager хранится ссылка на менеджер транзакций, определенный в конфигурации Spring; 5. timeOut – по умолчанию используется таймаут, установленный по умолчанию для базовой транзакционной системы. Сообщает менеджеру tx о продолжительности времени, чтобы дождаться простоя tx, прежде чем принять решение об откате не отвечающих транзакций; 6. isolation – уровень изолированности транзакций. 21.5. Interceptor?В Spring, когда запрос отправляется controller, перед тем как запрос обрабатывается Controller-ом, он должен перейти через перехватчиков Interceptor (0 или более). Spring Interceptor это понятие доволно схожее с Servlet Filter. Spring Interceptor применяется к запросам отправленным к Controller. Мануал: https://clck.ru/sQNu5 21.5.1. Что делает Interceptor?1. Считывает атрибуты (параметры), которые были у аннотации @Transactional; Пример кода: txAttr = getTRansactionAttributeSource(); getTransactionAttribute(invocation.getMethod(), targetClass); 2. Предоставляет интерфейс PlatformTransactionManager – основной интерфейс для всех TransactionManager (TransactionManager взаимодействует непосредственно с БД для управлением транзакций); Пример кода: PlatformTransactionManager ptm = determineTransactionManager(txAttr); Spring сам по себе транзакциями не управляет. Он является прослойкой между вашим декларативным описанием и конечной базой данных. Он все делегирует базе данных. Spring — это просто удобный для нас способ объявить транзакции, но внутри себя Spring не содержит чего-то такого, что можно было бы назвать транзакцией. 3. Идет создание транзакций – в зависимости от того, как сконфигурированы атрибуты, транзакцию можно начать или нет. Пример кода: TransactionInfo trInfo = createTransactionIfNecessary(ptm, txAttr, joinpointIdentification); 4. Происходит вызов основного метода, Пример кода: try { retVal = invocation.proceed(); } catch(Throwable ex) { completeTransactionAfterThrowinf(trInfo, ex); } где invocation.proceed() – вызов основного транзакционного метода с кодом. 5. Происходит commit транзакции если нет exception. Пример кода: commitTransactionAfterReturning(trInfo); Что касается настроек, так в XML можно указать такие параметры, как: все методы, начинающиеся на find, сделать readOnly, а методы, начинающиеся на create получают откат транзакции в случае возникновения, например SQLException и не откатываются в случае получения RuntimeException, уровни изоляции и другие. Пример кода: propagation=”MANDATORY”/> < /tx:attributes> Также можно указать для какого конкретно класса можем использовать эти правила, что позволяет более гибко настраивать логику. Указываем, что данное правило будет применяться для всех методов в классе FindInformationService будет использоваться конфигурация transactionRule01. Пример кода: com.helpdesk.FindInformationService.*(…))”/> ref=”findInformationServiceByUser”> |