Инструкция по созданию бизнесобъектов. Strategy это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми
Скачать 0.73 Mb.
|
21.5.2. В чем разница между Filters, Listeners and Interceptors?Filter выполняет задачи фильтрации либо по пути запроса к ресурсу, либо по пути ответа от ресурса, либо в обоих направлениях. Фильтры выполняют фильтрацию в методе doFilter. Каждый фильтр имеет доступ к объекту FilterConfig, из которого он может получить параметры инициализации, и ссылку на ServletContext. Фильтры настраиваются в дескрипторе развертывания веб-приложения. При создании цепочки фильтров, веб-сервер решает, какой фильтр вызывать первым, в соответствии с порядком регистрации фильтров. Когда вызывается метод doFilter(...) первого фильтра, веб-сервер создает объект FilterChain, представляющий цепочку фильтров, и передает ее в метод. Фильтры зависят от контейнера сервлетов, могут работать с js, css. Interceptor являются аналогом Filter в Spring. Перехватить запрос клиента можно в трех местах: preHandle, postHandle и afterCompletion. Перехватчики работают с HandlerMapping и поэтому должны реализовывать интерфейс HandlerInterceptor или наследоваться от готового класса HandlerInterceptorAdapter, после чего переопределить указанные методы. Чтобы добавить перехватчики в конфигурацию Spring, необходимо переопределить метод addInterceptors() внутри класса, который реализует WebMvcConfigurer. Interceptor основан на механизме Reflection, а фильтр основан на обратном вызове функции. preHandle – метод используется для обработки запросов, которые еще не были переданы в метод контроллера. Должен вернуть true для передачи следующему перехватчику или в handler method. False укажет на обработку запроса самим обработчиком и отсутствию необходимости передавать его дальше. Метод имеет возможность выкидывать исключения и пересылать ошибки к представлению. postHandle – вызывается после handler method, но до обработки DispatcherServlet для передачи представлению. Может использоваться для добавления параметров в объект ModelAndView. afterCompletion – вызывается после отрисовки представления. Listener – это класс, имплементирующий интерфейс ServletContextListener с аннотацией @WebListener. Listener ждет, когда произойдет указанное событие, затем «перехватывает» событие и запускает собственное событие. Он инициализируется только один раз при запуске веб-приложения и уничтожается при остановке веб-приложения. Все ServletContextListeners уведомляются об инициализации контекста до инициализации любых фильтров или сервлетов в веб-приложении и об уничтожении контекста после того, как все сервлеты и фильтры уничтожены. 21.6. Пример JPATransactionManager?В Spring есть абстрактный класс AbstractPlatformTransactionManager, который является основным для всех TransactionManager. Он определяет транзакции, применяет уже сконфигурированный уровень propagation, может приостанавливать и возобновлять транзакции, установка флага rollbackOnly для определенного действия и т.д. Последовательность шагов: 1. получили EntityManagerFactory; 2. получили DataSource; 3. исходя из диалекта (какая у нас БД) создается новая транзакция beginTransaction() т.е. Spring ничего не делает, он просто “говорит” что знает какая у нас БД и предоставляет нам соответствующий для нее диалект и т.д.; 4. зарегистрировали полученное соединение в ThreadLocal объекте. Все соединения и транзакции являются потокозависимыми (все выполняется в текущем потоке), т.е. когда мы начали транзакцию в своем потоке мы не можем ее как-то напрямую расширить на другой поток (в этом случае будет начинаться новая транзакция). Разве что можно отключить транзакцию от потока и “приаттачить” к другому. 5. beginTransaction() prepareTransaction() commitTransaction(). 21.7. Что такое TransactionDefinition и TransactionStatus?Это интерфейсы. TransactionDefinition содержит в себе конфигурацию транзакции, уровень изоляции и propagation. TransactionStatus возвращает статус текущей транзакции. 21.8 Как именно работают транзакции?Существует стандарт XA (eXtended Architecture), который связывает источник данных (dataSource) с TransactionManager. Базы данных должны реализовывать этот стандарт внутри себя, чтобы TransactionManager мог управлять ими и создавать транзакции. стандарт поддерживает 2 типа коммитов: 1. однофазный — работает с одним источником данных (1 база данных) — только 1 транзакция — либо выполнилась, либо нет; 2. двухфазный — работает с 2 или более источником данных — имеется несколько DataSource, внутри каждого есть своя транзакция и есть 1 глобальная транзакция для этих внутренних транзакций. Транзакции работают в своем потоке. Есть такой термин как transaction context — он обязательно имеет id, который обозначает, что транзакция работает в таком-то контексте. Также может иметь другие параметры. |