Evgeniy Krivosheev Andrey Stukalenko Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 3 – AOP.

Презентация:



Advertisements
Похожие презентации
Spring Framework Module 3 – AOP. 2 Spring Framework :: AOP :: Example class UserService { public UserDTO getUser(Integer id) { UserDTO user = userDAO.getUser(id);
Advertisements

Обзор возможностей Инверсия управления Аспектно-ориентированное программирование.
Обзор возможностей Инверсия управления Аспектно-ориентированное программирование.
Evgeniy Krivosheev Andrey Stukalenko Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 3 – AOP.
Evgeniy Krivosheev Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 4 – DAO, JDBC.
Evgeniy Krivosheev Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 4 – JNDI.
Обеспечение целостности данных Процедурное. Хранимые процедуры Хранимые процедуры пишутся на специальном встроенном языке программирования, они могут.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Обзор возможностей Инверсия управления Аспектно-ориентированное программирование.
Java: интерфейсы, наследование, обработка исключительных ситуаций Вашенков Олег Евгеньевич.
Аспектно-ориентированное программирование Copyright © Мигинский Д.С.,
PL/SQL Триггеры (INSERT, UPDATE, DELETE). Определение Три́ггер базы данных (англ. trigger) это хранимая процедура особого типа, которую пользователь не.
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
Saint Petersburg, 2011 Java Lecture #06 Exceptions.
Triggers для mysql. Что есть триггер? Триггер - это хранимая процедура особого типа, исполнение которой обусловлено наступлением определенного события.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
ДЕЛЕГАТЫ Лекция 7 1. Зачем нужны делегаты 2 И данные, и код располагаются в памяти компьютера по определенным адресам. Передача адресов данных в C# происходит.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Часть 1. Основы ООП Исключения.. Структурный подход Неисправимые ошибки – вывести информацию и умереть. Исправимые ошибки – уведомить вызывающую.
Транксрипт:

Evgeniy Krivosheev Andrey Stukalenko Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 3 – AOP

2 Spring Framework :: AOP :: Пример class UserService { public UserDTO getUser(Integer id) { UserDTO user = userDAO.getUser(id); return user; } } Рассмотрим пример: метод для получения пользователя по id:

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 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 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 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 Spring Framework :: AOP :: Пример -Большое количество сервисного кода -Вместо 1 строчки мы получили 16 -И это еще не все – код будет продолжать расти!... Виды ортогональной функциональности: -Логгирование -Обработка исключений -Транзакции -Кэширование -Проверка прав доступа -и многое другое... Минусы сервисного кода в основном коде: -Растет объем кода -Сложнее поддерживать -Дублирование кода Решение: использовать аспекты Вынос ортогональной функциональности в отдельные классы – аспекты Сделать что-то до метода Вызвать метод Сделать что-то после метода АСПЕКТ:

8 Spring Framework :: AOP :: Введение Aspect Oriented Programming (AOP) – Аспектно-Ориентированное Программирование АОП предоставляет средства для реализации ортогональной (crosscutting) функциональности

9 Spring Framework :: AOP :: Введение Вопрос: Как «ортогональную» бизнес-логику можно реализовать в СУБД?

10 Spring Framework :: AOP :: Введение Вопрос: Как «ортогональную» бизнес-логику можно реализовать в СУБД? Ответ: В СУБД для подобной функциональности используются триггеры. Пример логгирования с использованием триггеров: /* Триггер на уровне таблицы */ CREATE OR REPLACE TRIGGER DistrictUpdatedTrigger AFTER UPDATE ON district BEGIN INSERT INTO info VALUES ('table "district" has changed'); END;

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 Logging Advice Spring Framework :: AOP :: Введение UserService UserDAOProxy Application context 1. Инъекция DAO 2. Вызов метода прокси DAO Работа с DAO c IoC и AOP Логгирование входа в метод UserDAO 3. Вызов адвайса 5. Вызов адвайса 4. Вызов Метода UserDAO Логгирование выхода из метода

13 Advice chain Spring Framework :: AOP :: Введение UserServiceUserDAOProxy Application context 1. Инъекция DAO 2. Вызов метода прокси DAO Работа с DAO c IoC и advice... advice Вызов 5. Вызов 4. Вызов методов UserDAO

14 Spring Framework :: AOP :: Введение В Spring Framework AOP реализуется с помощью создания прокси-объекта на интересующий вас сервис Cтандартный механизм создания динамических прокси из J2SE CGLIB прокси

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 <beans xmlns=" xmlns:xsi=" xmlns:aop=" xsi:schemaLocation=" xsd xsd "> Spring Framework :: AOP :: Пример аспекта для логгирования

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 Spring Framework :: AOP :: Введение Схематически все основные элементы AOP и их взаимодействие изображены ниже:

19 Spring Framework :: Активация AOP Weaving: связывание – процесс применения aspectа к target объекту для создания нового proxy объекта; Для осуществления связывания в runtime в classpath Spring Framework использует две дополнительные зависимости: aspectjrt.jar aspectjweaver.jar Также необходимо инициировать создание динамических прокси в файле конфигурации:

20 Spring Framework :: Активация AOP

21 Spring :: AOP :: Язык Pointcutов Pointcut: точки соединения с Advice

22 Spring Framework :: AOP :: Введение Join Point - Точка во время выполнения приложения, где Aspect может быть применен: Точка пересечения «основной» и «ортогональной» функциональности; В Spring Framework в качестве Join Point может выступать только метод (в нашей диаграмме это методы синего треугольника в иерархии классов). Pointcut - предикат, определяющий в каких join pointах должен быть применен advice. Spring AOP язык описания pointcutов по умолчанию.

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 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 Spring :: AOP :: Типы - выполняется перед joinpointом Нет возможности отменить вызов joinpointа, кроме как выбросить - выполняется после - выполняется перед и после – после успешного исполнения joinpointа, например, метод выполнился, не выбросив – в случае выброшенного исключения в (finally) – в любом случае после исполнения joinpointа;

26 Spring :: AOP :: Типы - окружает joinpoint Наиболее мощный из всех типов adviceов; Может решать, исполнять joinpoint или вернуть собственное public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // start stopwatch Object retVal = pjp.proceed(); // stop stopwatch return retVal; }

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 Spring :: AOP :: Пример использования Алгоритм: Покупатель приходит в бар Бармен здоровается Покупатель заказывает напиток Если у покупателя есть деньги Ему продают напиток Бармен спрашивает его мнение Если нет денег (isBroke) Ему что-то говорят Бармен прощается с покупателем

29 Spring :: AOP :: Пример использования Мини-опрос: Какие из шагов алгоритма относятся к базовой, а какие к ортогональной функциональности? Покупатель приходит в бар Бармен здоровается Покупатель заказывает напиток Если у покупателя есть деньги Ему продают напиток Бармен спрашивает его мнение Если нет денег (isBroke) Ему что-то говорят Бармен прощается с покупателем

30 Spring :: AOP :: Пример использования Мини-опрос: Какие из шагов алгоритма относятся к базовой, а какие к ортогональной функциональности? Покупатель приходит в бар Бармен здоровается Покупатель заказывает напиток Если у покупателя есть деньги Ему продают напиток основная функциональность Бармен спрашивает его мнение Если нет денег (isBroke) Ему что-то говорят Бармен прощается с покупателем

31 Spring :: AOP :: Пример использования Бизнес-объекты:

32 Spring :: AOP :: Пример использования Ортогональная, вспомогательная функциональность:

33 Spring :: AOP :: Пример использования Ортогональная, вспомогательная функциональность:

34 Упражнения 5: Использование Spring style. : – мин – самостоятельная работа; –15 мин – обсуждение;

35 Вопросы!?