Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемВалерия Суковкина
1 Evgeniy Krivosheev Andrey Stukalenko Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 3 – AOP
2 2 Spring Framework :: AOP :: Пример class UserService { public UserDTO getUser(Integer id) { UserDTO user = userDAO.getUser(id); return user; } } Рассмотрим пример: метод для получения пользователя по id:
3 3 Spring Framework :: AOP :: Пример public UserDTO getUser(Integer id) { UserDTO user = userDAO.getUser(id); return user; } Рассмотрим метод для получения пользователя по id: public UserDTO getUser(Integer id) { LOG.debug("Call method getUser with id " + id); UserDTO user = userDAO.getUser(id); LOG.debug(User info is: " + user.toString()); return user; } Добавим логгирование:
4 4 Spring Framework :: AOP :: Пример public UserDTO getUser(Integer id) throws ServiceException{ LOG.debug("Call method getUser with id " + id); UserDTO user = null; UserDTO user = userDAO.getUser(id); try { user = userDAO.getUser(id); } catch(SQLException e) { throw new ServiceException(e); } LOG.debug(User info is: " + user.toString()); return user; } Добавим обработку исключений:
5 5 Spring Framework :: AOP :: Пример public UserDTO getUser(Integer id) throws ServiceException, AuthException { if (!SecurityContext.getUser().hasRight("GetUser")) throw new AuthException("Permission Denied"); LOG.debug("Call method getUser with id " + id); UserDTO user = null; UserDTO user = userDAO.getUser(id); try { user = userDAO.getUser(id); } catch(SQLException e) { throw new ServiceException(e); } LOG.debug(User info is: " + user.toString()); return user; } Добавим проверку прав доступа:
6 6 Spring Framework :: AOP :: Пример public UserDTO getUser(Integer id) throws ServiceException, AuthException { if (!SecurityContext.getUser().hasRight("GetUser")) throw new AuthException("Permission Denied"); LOG.debug("Call method getUser with id " + id); UserDTO user = null; String cacheKey = "getUser:" + id; UserDTO user = userDAO.getUser(id); try { if (cache.contains(cacheKey)) { user = (UserDTO) cache.get(cacheKey); } else { user = userDAO.getUser(id); cache.put(cacheKey, user); } } catch(SQLException e) { throw new ServiceException(e); } LOG.debug(User info is: " + user.toString()); return user; } Добавим кэширование результатов работы:
7 7 Spring Framework :: AOP :: Пример -Большое количество сервисного кода -Вместо 1 строчки мы получили 16 -И это еще не все – код будет продолжать расти!... Виды ортогональной функциональности: -Логгирование -Обработка исключений -Транзакции -Кэширование -Проверка прав доступа -и многое другое... Минусы сервисного кода в основном коде: -Растет объем кода -Сложнее поддерживать -Дублирование кода Решение: использовать аспекты Вынос ортогональной функциональности в отдельные классы – аспекты Сделать что-то до метода Вызвать метод Сделать что-то после метода АСПЕКТ:
8 8 Spring Framework :: AOP :: Введение Aspect Oriented Programming (AOP) – Аспектно-Ориентированное Программирование АОП предоставляет средства для реализации ортогональной (crosscutting) функциональности
9 9 Spring Framework :: AOP :: Введение Вопрос: Как «ортогональную» бизнес-логику можно реализовать в СУБД?
10 10 Spring Framework :: AOP :: Введение Вопрос: Как «ортогональную» бизнес-логику можно реализовать в СУБД? Ответ: В СУБД для подобной функциональности используются триггеры. Пример логгирования с использованием триггеров: /* Триггер на уровне таблицы */ CREATE OR REPLACE TRIGGER DistrictUpdatedTrigger AFTER UPDATE ON district BEGIN INSERT INTO info VALUES ('table "district" has changed'); END;
11 11 UserService Spring Framework :: AOP :: Введение UserDAO Application repository 1. Получение DAO 2. Вызов метода DAO UserServiceUserDAO Application context 1. Инъекция DAO 2. Вызов метода DAO Работа с DAO без IoC и AOP Работа с DAO c IoC, но без AOP
12 12 Logging Advice Spring Framework :: AOP :: Введение UserService UserDAOProxy Application context 1. Инъекция DAO 2. Вызов метода прокси DAO Работа с DAO c IoC и AOP Логгирование входа в метод UserDAO 3. Вызов адвайса 5. Вызов адвайса 4. Вызов Метода UserDAO Логгирование выхода из метода
13 13 Advice chain Spring Framework :: AOP :: Введение UserServiceUserDAOProxy Application context 1. Инъекция DAO 2. Вызов метода прокси DAO Работа с DAO c IoC и advice... advice Вызов 5. Вызов 4. Вызов методов UserDAO
14 14 Spring Framework :: AOP :: Введение В Spring Framework AOP реализуется с помощью создания прокси-объекта на интересующий вас сервис Cтандартный механизм создания динамических прокси из J2SE CGLIB прокси
15 public class LoggingAspect { private final static Logger LOG = *service.*(..))") public void serviceMethod() { ") public Object logWebServiceCall(ProceedingJoinPoint thisJoinPoint) { String methodName = thisJoinPoint.getSignature().getName(); Object[] methodArgs = thisJoinPoint.getArgs(); LOG.debug("Call method " + methodName + " with args " + methodArgs); Object result = thisJoinPoint.proceed(); LOG.debug("Method " + methodName + " returns " + result); return result; } } Spring Framework :: AOP :: Пример аспекта для логгирования
16
16
17 17 interface UserServiceIF { public UserDTO getUser(Integer id); } class UserService implements UserServiceIF { public UserDTO getUser(Integer id) { UserDTO user = userDAO.getUser(id); return user; } С помощью аспектов автоматически могут быть добавлены: -Логгирование -Обработка исключений -Транзакции -Кэширование -Проверка прав доступа -и многое другое... Spring Framework :: AOP :: Пример аспекта для логгирования
18 18 Spring Framework :: AOP :: Введение Схематически все основные элементы AOP и их взаимодействие изображены ниже:
19 19 Spring Framework :: Активация AOP Weaving: связывание – процесс применения aspectа к target объекту для создания нового proxy объекта; Для осуществления связывания в runtime в classpath Spring Framework использует две дополнительные зависимости: aspectjrt.jar aspectjweaver.jar Также необходимо инициировать создание динамических прокси в файле конфигурации:
20 20 Spring Framework :: Активация AOP
21 21 Spring :: AOP :: Язык Pointcutов Pointcut: точки соединения с Advice
22 22 Spring Framework :: AOP :: Введение Join Point - Точка во время выполнения приложения, где Aspect может быть применен: Точка пересечения «основной» и «ортогональной» функциональности; В Spring Framework в качестве Join Point может выступать только метод (в нашей диаграмме это методы синего треугольника в иерархии классов). Pointcut - предикат, определяющий в каких join pointах должен быть применен advice. Spring AOP язык описания pointcutов по умолчанию.
23 23 Spring :: AOP :: Язык Pointcutов execution – определяет точки соединения на основании имени метода execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?.name-pattern(param-pattern) throws-pattern?) ? – опциональные параметры declaring-type-pattern - шаблон для имени пакета и класса Примеры: execution (* *(..)) – связывание с любым методом, вне зависимости от возвращаемого типа или параметров; execution (int *(..)) – связывание с любым методом, возвращающим int, вне зависимости от параметров; execution (!static * *(..)) – связывание с любым не статическим методом, вне зависимости от параметров; execution(* com.package.subpackage.Classname.*(..)) – вызов любого метода класса com.package.subpackage.Classname; execution (void Test.foo(int, String)) – связывание с методом foo, класса Test, принимающим в качестве параметров int и String; execution (* foo.bar.*.dao.update*(..)) – связывание с любым методом начинающимся на «update» суп пакета dao;
24 24 bean – связывание с join points определенного Spring бина (или набора бинов) bean(*Bean) - определяет точки соединения для всех управляемых компонент с именем (идентификатором) заканчивающимся на Bean within – связывание с любым методом в рамках соответствующего класса within(com.package.subpackage.*) – определяет вызовы методов всех классов, определенных в пакете com.package.subpackage this – связывание с join points в случае если бин AOP Proxy является объектом заданного типа this(com.package.InterfaceName) – определяет вызовы методов у объектов- посредников, реализующих интерфейс com.package.InterfaceName target – связывание с join points когда целевой объект (т.е. объект, который обернут прокси) является объектом заданного типа target(com.package.InterfaceName) – определяет вызовы методов объектов, целевой класс которых реализует интерфейс com.package.InterfaceName args – связывание с join points где аргументами являются объекты заданных типов args(String) – определяет методы, у которых определен один строковый - задает точки соединения для методов, которые были «помечены» указанной Spring :: AOP :: Язык Pointcutов
25 25 Spring :: AOP :: Типы - выполняется перед joinpointом Нет возможности отменить вызов joinpointа, кроме как выбросить - выполняется после - выполняется перед и после – после успешного исполнения joinpointа, например, метод выполнился, не выбросив – в случае выброшенного исключения в (finally) – в любом случае после исполнения joinpointа;
26 26 Spring :: AOP :: Типы - окружает joinpoint Наиболее мощный из всех типов adviceов; Может решать, исполнять joinpoint или вернуть собственное public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // start stopwatch Object retVal = pjp.proceed(); // stop stopwatch return retVal; }
27 public class SystemArchitecture public void inServiceLayer() public void inDataAccessLayer() com.luxoft.dao.*.*(..))") public void dataAccessOperation() {} public class AfterThrowingExample pointcut="com.luxoft.example.SystemArchitecture.dataAccessOperation()", throwing="ex") public void doRecoveryActions(DataAccessException ex) { //... } Spring :: AOP ::
28 28 Spring :: AOP :: Пример использования Алгоритм: Покупатель приходит в бар Бармен здоровается Покупатель заказывает напиток Если у покупателя есть деньги Ему продают напиток Бармен спрашивает его мнение Если нет денег (isBroke) Ему что-то говорят Бармен прощается с покупателем
29 29 Spring :: AOP :: Пример использования Мини-опрос: Какие из шагов алгоритма относятся к базовой, а какие к ортогональной функциональности? Покупатель приходит в бар Бармен здоровается Покупатель заказывает напиток Если у покупателя есть деньги Ему продают напиток Бармен спрашивает его мнение Если нет денег (isBroke) Ему что-то говорят Бармен прощается с покупателем
30 30 Spring :: AOP :: Пример использования Мини-опрос: Какие из шагов алгоритма относятся к базовой, а какие к ортогональной функциональности? Покупатель приходит в бар Бармен здоровается Покупатель заказывает напиток Если у покупателя есть деньги Ему продают напиток основная функциональность Бармен спрашивает его мнение Если нет денег (isBroke) Ему что-то говорят Бармен прощается с покупателем
31 31 Spring :: AOP :: Пример использования Бизнес-объекты:
32 32 Spring :: AOP :: Пример использования Ортогональная, вспомогательная функциональность:
33 33 Spring :: AOP :: Пример использования Ортогональная, вспомогательная функциональность:
34 34 Упражнения 5: Использование Spring style. : – мин – самостоятельная работа; –15 мин – обсуждение;
35 35 Вопросы!?
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.