Содержание
- 2. План Pointcut Комбинирование Pointcut Порядок выполнения Aspect-ов
- 3. Pointcut Pointcut – выражение, описывающее, где должен быть применен Advice. Spring AOP использует AspectJ Pointcut expression
- 4. Pointcut Для описания Pointcut используется шаблон. Выделены обязательные элементы. execution( modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(parameters-pattern) throws-pattern? )
- 5. Pointcut Рассмотрим пример с предыдущей лекции. По шаблону мы указали все, кроме declaring-type-pattern и throws-pattern. Отсутствие
- 6. Pointcut Создадим абстрактный класс от которого будет наследоваться класс Library
- 7. Pointcut Переименуем класс, чтобы его название конкретизировало его природу. Например, в университетскую библиотеку. Создадим класс школьная
- 8. Pointcut Вызовем метод в классе Test1
- 9. Pointcut Вывод: Это произошло, поскольку оба метода подходят под Pointcut.
- 10. Pointcut Модифицируем Pointcut, чтобы метод вызвался только для UniLibrary. Для этого нам необходимо указать declaring-type-pattern, а
- 11. Pointcut execution(public void getBook()) – соответствует методу без параметров, где бы он ни находился, с модификатором
- 12. Pointcut execution(public void get*()) – соответствует методу без параметров, где бы он ни находился, с модификатором
- 13. Pointcut Добавим метод getMagazine в UniLibrary.
- 14. Pointcut Добавим вызов метода getMagazine в Test1.
- 15. Pointcut Как мы можем видеть аспект был вызван трижды. Для getBook и getMagazine из UniLibrary и
- 16. Pointcut Приведем пример работы с return-type-pattern. Добавим еще один Advice: и метод в UniLibrary:
- 17. Pointcut В классе Test1 вызовем метод returnBook: Вывод указывает на то, что Advice работает:
- 18. Pointcut Теперь, если мы изменим возвращаемый тип, например вот так: Метод больше не будет подходить под
- 19. Pointcut Если мы хотим аналогичным образом поступить с модификатором доступа, мы можем просто его убрать, оставив
- 20. Pointcut Таким образом: execution(* returnBook()) - соответствует методу без параметров, где бы он ни находился, с
- 21. Pointcut Рассмотрим параметры метода при написании Pointcut. Для этого вернем класс UniLibrary в первоначальное состояние. Это
- 22. Pointcut Добавим параметр в метод getBook В Test1 добавим параметр при вызове метода Убедимся, что при
- 23. Pointcut Добавим параметр в Advice. Обратите внимание, что указывается только тип параметра, но не его название.
- 24. Pointcut execution(public void getBook(String)) - соответствует методу с параметром String, где бы он ни находился, с
- 25. Pointcut Допустим, что мы хотим, чтобы под наш шаблон подходил любой метод, имеющий только 1 параметр.
- 26. Pointcut Вызовем метод в Test1: Вывод:
- 27. Pointcut Если же мы хотим, чтобы под описанный шаблон подходил метод с любым количеством параметров, необходимо
- 28. Pointcut execution(public void getBook(String)) - соответствует методу с параметром String, где бы он ни находился, с
- 29. Pointcut Рассмотрим ситуацию, когда параметр имеет тип созданного нами класса. Создадим класс Book:
- 30. Pointcut В UniLibrary меняем параметр метода getBook на Book. В Test1 получаем объект класса Book и
- 31. Pointcut Но, если в параметре Advice мы напишем просто Book будет ошибка. Нашему Pointcut непонятно, о
- 32. Pointcut execution(public void getBook(com.donnu.demo.aop.Book, ..)) - соответствует методу с первым параметром Book, и любым количеством других
- 33. Pointcut Вернем UniLibrary и другие элементы в исходное состояние
- 34. Pointcut Изменим Aspect, чтобы реализовать в нем и Advice для проверки прав.
- 35. Pointcut Проверим работу Advice. Логика работы beforeGetSecurityAdvice будет аналогична beforeGetLoggingAdvice:
- 36. Pointcut Для того, чтобы не пользоваться копированием, когда для нескольких Advice подходит один и тот же
- 37. Pointcut В нашем примере будет выглядеть следующим образом:
- 38. Pointcut Если данный метод будет иметь модификатор доступа public, то мы сможем использовать его в других
- 39. Pointcut Плюсы объявления Pointcut: Возможность использования одного Pointcut для множества Advice Возможность быстрого изменения Pointcut для
- 40. Комбинирование Pointcut Добавим в класс UniLibrary несколько методов
- 41. Комбинирование Pointcut Добавим в LoggingAndSecurityAspect добавим метод логирования получения книг
- 42. Комбинирование Pointcut Аналогично для return-методов. Но, что если у нас есть сквозная логика, которая должна выполняться
- 43. Комбинирование Pointcut Комбинирование Pointcut-ов – это их объединение с помощью логических операторов && || !
- 44. Комбинирование Pointcut
- 45. Комбинирование Pointcut Запустим Test1
- 46. Комбинирование Pointcut Рассмотрим ситуацию, когда мы хотим вызвать Advice для всех методов кроме одного.
- 47. Комбинирование Pointcut Вызываем Test1
- 48. Порядок выполнения Aspect-ов Рассмотрим ранее написанный пример.
- 49. Порядок выполнения Aspect-ов В Test1 вызовем методы с get. Вывод:
- 50. Порядок выполнения Aspect-ов Каким образом мы можем контролировать порядок выполнения? Для этого нам потребуется вынести методы
- 51. Порядок выполнения Aspect-ов Теперь создадим два аспекта. Обратите внимание, что для того, чтобы получить Pointcut необходимо
- 52. Порядок выполнения Aspect-ов Создадим еще один аспект. Теперь у нас три аспект-класса и три Advice направленных
- 53. Порядок выполнения Aspect-ов Теперь мы можем указать им порядок, с помощью аннотации @Order
- 54. Порядок выполнения Aspect-ов Вывод до аннотации @Order: Вывод после:
- 55. Порядок выполнения Aspect-ов Если при вызове одного метода с бизнес-логикой срабатывает несколько Advice, то нет никакой
- 57. Скачать презентацию