Объектно-ориентированное программирование. Лекция 5

Содержание

Слайд 2

План Join Point Advice @AfterReturning Advice @AfterThrowing Advice @After Advice @Around

План

Join Point
Advice @AfterReturning
Advice @AfterThrowing
Advice @After
Advice @Around

Слайд 3

Join Point Join Point – это точка/момент в программе, когда следует

Join Point

Join Point – это точка/момент в программе, когда следует применять

Advice. Т.е. точка переплетения метода с бизнес-логикой и метода со служебным функционалом.
Слайд 4

Join Point Для рассмотрения примера добавим несколько параметров и методов в

Join Point

Для рассмотрения примера добавим несколько параметров и методов в класс

Book, а в UniLibrary модифицируем вывод.
Слайд 5

Join Point Метод addBook теперь будет принимать параметр. В MyPointcuts поменяем

Join Point

Метод addBook теперь будет принимать параметр.
В MyPointcuts поменяем get на

add, чтобы работать с add-методами, в частности addBook, а также добавим вывод разделительных линий в Advice.
Слайд 6

Join Point Для чего же нужен Join Point? Прописав Join Point

Join Point

Для чего же нужен Join Point?
Прописав Join Point в параметре

метода Advice, мы получаем доступ к информации о сигнатуре и параметрах метода с бизнес-логикой.
Наверняка у многих при написании метода связанного с логированием, возникал вопрос, как же в лог мы будем писать информацию о самом методе, благодаря которому этот Advice был вызван, как мы будем использовать параметры этого метода.
Для этого мы используем Join Point.
Слайд 7

Join Point Рассмотрим на примере. Вызовем метод addBook в Test1. В

Join Point

Рассмотрим на примере. Вызовем метод addBook в Test1.
В LoggingAspect рассмотрим,

что мы можем получить из joinPoint.
Слайд 8

Join Point Вывод:

Join Point

Вывод:

Слайд 9

Join Point Вывод для addMagazine

Join Point

Вывод для addMagazine

Слайд 10

Join Point Рассмотрим работу с параметрами. Поскольку у addMagazine нет параметров,

Join Point

Рассмотрим работу с параметрами. Поскольку у addMagazine нет параметров, он

нам не интересен, мы хотим получить параметры метода addBook. Это можно сделать простым условием:
Слайд 11

Join Point Для работы с параметрами мы можем применить метод getArgs(), который вернет нам Object[]

Join Point

Для работы с параметрами мы можем применить метод getArgs(), который

вернет нам Object[]
Слайд 12

Join Point Полный вывод:

Join Point

Полный вывод:

Слайд 13

Advice типы Типы Advice: Before – выполняется до метода с основной

Advice типы

Типы Advice:
Before – выполняется до метода с основной логикой
After returning

– выполняется только после того, как метод корректно отработал
After throwing – выполняется после метода с основной логикой, если было выброшено исключение
After / After finally – выполняется после метода с основной логикой (в любом случае)
Around – выполняется и до, и после
Слайд 14

Advice @AfterReturning @AfterReturning Advice выполняется в том случае, если при работе

Advice @AfterReturning

@AfterReturning Advice выполняется в том случае, если при работе метода

c бизнес-логикой не возникло исключений.
Также методы с основной логикой можно назвать target-методами.
Слайд 15

Advice @AfterReturning Создадим класс Student, добавим геттеры, сеттеры и переопределим метод toString.

Advice @AfterReturning

Создадим класс Student, добавим геттеры, сеттеры и переопределим метод toString.

Слайд 16

Advice @AfterReturning Создадим класс University и определим его как компонент.

Advice @AfterReturning

Создадим класс University и определим его как компонент.

Слайд 17

Advice @AfterReturning Создадим Advice который отработает до метода и который отработает после успешного завершения.

Advice @AfterReturning

Создадим Advice который отработает до метода и который отработает после

успешного завершения.
Слайд 18

Advice @AfterReturning Для проверки работоспособности создаем класс Test2

Advice @AfterReturning

Для проверки работоспособности создаем класс Test2

Слайд 19

Advice @AfterReturning Вывод:

Advice @AfterReturning

Вывод:

Слайд 20

Advice @AfterReturning Важный момент! Поскольку @AfterReturning отрабатывает после метода, в нем

Advice @AfterReturning

Важный момент!
Поскольку @AfterReturning отрабатывает после метода, в нем мы можем

перехватить результат работы метода, залогировать, и даже модифицировать его.
Слайд 21

Advice @AfterReturning Для этого необходимо указать дополнительный параметр returning. Имя переданное

Advice @AfterReturning

Для этого необходимо указать дополнительный параметр returning. Имя переданное в

returning должно совпадать с именем параметра переданного в метод.
Слайд 22

Advice @AfterReturning Вывод после модификации:

Advice @AfterReturning

Вывод после модификации:

Слайд 23

Advice @AfterReturning Вывод: @AfterReturning Advice выполняется после метода с бизнес-логикой, если

Advice @AfterReturning

Вывод:
@AfterReturning Advice выполняется после метода с бизнес-логикой, если не было

брошено исключений. Он выполняется до присвоения результата метода переменной. Поэтому с помощью @AfterReturning Advice можно изменить результат работы метода. Злоупотреблять этим не стоит.
Если есть необходимость, можно указать Join Point:
Слайд 24

Advice @AfterThrowing Advice @AfterThrowing выполняется после метода с бизнес-логикой, если в

Advice @AfterThrowing

Advice @AfterThrowing выполняется после метода с бизнес-логикой, если в процессе

работы методы было брошено исключение.
*если бросается исключение – сразу наступает окончание работы метода.
Слайд 25

Advice @AfterThrowing Изменим метод getStudents таким образом, чтобы в процессе работы

Advice @AfterThrowing

Изменим метод getStudents таким образом, чтобы в процессе работы было

брошено исключение.
*в students всего 3 элементы с индексами 0, 1 и 2.
Слайд 26

Advice @AfterThrowing Создадим Advice afterThrowingGetStudentsLoggingAdvice И запускаем Test2 без изменений. Получаем ошибку:

Advice @AfterThrowing

Создадим Advice afterThrowingGetStudentsLoggingAdvice
И запускаем Test2 без изменений. Получаем ошибку:

Слайд 27

Advice @AfterThrowing Обратите внимание, что advice отработал до того как исключение

Advice @AfterThrowing

Обратите внимание, что advice отработал до того как исключение было

выведено в консоль, соответственно до того, как оно попало в main-метод и выполнение программы прекратилось.
Чтобы это предотвратить мы можем использовать try:
Слайд 28

Advice @AfterThrowing Таким образом мы можем поймать не только ожидаемое исключение: но и любое другое:

Advice @AfterThrowing

Таким образом мы можем поймать не только ожидаемое исключение:
но и

любое другое:
Слайд 29

Advice @AfterThrowing Чтобы получить само исключение в advice необходимо: Вывод:

Advice @AfterThrowing

Чтобы получить само исключение в advice необходимо:
Вывод:

Слайд 30

Advice @AfterThrowing Важно! Мы не можем остановить или обработать исключение в

Advice @AfterThrowing

Важно!
Мы не можем остановить или обработать исключение в Advice @AfterThrowing,

чтобы оно не попало в main.
Таким образом:
Advice @AfterThrowing не влияет на протекание программы при выбрасывании исключений. С помощью @AfterThrowing можно получить доступ к исключению, которое было брошено из метода с бизнес-логикой.
Слайд 31

Advice @After Advice @After – выполняется после метода с бизнес логикой,

Advice @After

Advice @After – выполняется после метода с бизнес логикой, независимо

от того, как метод отработал.
Вывод:
Слайд 32

Advice @After С помощью Advice @After невозможно: получить доступ к исключению,

Advice @After

С помощью Advice @After невозможно:
получить доступ к исключению, которое было

брошено методом с бизнес-логикой;
получить доступ к возвращаемому результату.
В Advice @After можно использовать Join Point.
Слайд 33

Advice @Around Advice @Around выполняется до и после метода с бизнес

Advice @Around

Advice @Around выполняется до и после метода с бизнес логикой.
С

помощью Advice @Around можно:
произвести действие до работы target-метода;
произвести действие после работы target-метода;
получить результат работы target-метода (изменить его);
предпринять действия, если target-метод выбросил исключение.
Слайд 34

Advice @Around Вернемся в класс UniLibrary и изменим метод returnBook Создадим новый Aspect

Advice @Around

Вернемся в класс UniLibrary и изменим метод returnBook
Создадим новый Aspect

Слайд 35

Advice @Around Создадим Test3 для вызова метода

Advice @Around

Создадим Test3 для вызова метода

Слайд 36

Advice @Around Выводим результат: Почему вывелся null и sout в самом методе не сработал?

Advice @Around

Выводим результат:
Почему вывелся null и sout в самом методе не

сработал?
Слайд 37

Advice @Around Это связано с работой Advice @Around. Он работает до

Advice @Around

Это связано с работой Advice @Around. Он работает до и

после метода, но не таким образом, как изначально могло показаться. Можно подумать, что он просто дважды выполнит содержимое своего метода:
На самом деле Advice @Around работает не так. Обратите внимание на вывод, target-метод не отработал. Дело в том, что используя Advice @Around мы берем на себя ответственность самим запускать target-метод.
Слайд 38

Advice @Around В качестве параметра метод принимает ProceedingJoinPoint. Это связь с target-методом. Вывод:

Advice @Around

В качестве параметра метод принимает ProceedingJoinPoint. Это связь с target-методом.
Вывод:

Слайд 39

Advice @Around Стоит отметить, что с помощью ProceedingJoinPoint можно получить доступ

Advice @Around

Стоит отметить, что с помощью ProceedingJoinPoint можно получить доступ к

сигнатуре и параметрам метода, как и с помощью Join Point.
Слайд 40

Advice @Around Засечем время работы метода returnBook Вывод:

Advice @Around

Засечем время работы метода returnBook
Вывод:

Слайд 41

Advice @Around Можно изменить результат работы метода, как и было указано выше

Advice @Around

Можно изменить результат работы метода, как и было указано выше

Слайд 42

Advice @Around Используя Advice @Around можно предпринять следующие действия, если было

Advice @Around

Используя Advice @Around можно предпринять следующие действия, если было брошено

исключение:
1. Ничего не делать
Слайд 43

Advice @Around 2. Обработать исключение

Advice @Around

2. Обработать исключение