Аспектно-орієнтоване програмування в spring framework

Спочатку я не буду вантажити вас теорією, тому давайте поки створимо мавеновскій проект і додамо в помнік наступні залежності:


Тепер створимо інтерфейс Performer
І заімплементім його в класі PerformerImpl
Далі нам потрібно створити клас з порадами, вони ж advices. Назвемо його Aspect.
Тепер створимо xml, де будемо налаштовувати наше спрінговое додаток.
Отже трохи теорії.

Аспектно-орієнтоване програмування (АОП) - це методика програмування в рамках класової парадигми, заснована на понятті аспекту - блоку коду, що інкапсулює наскрізне поведінку в складі класів та повторно використовуваних модулів.

У нашому випадку аспект - це клас, який ми додали, а методи в ньому називаються радами або advices. Вони діляться на 5 типів:

  • Before (до виконання методу)
  • After (після виконання)
  • After returning (після повернення результату)
  • After throwing (після викидання виключення)
  • Around (об'єднання декілька порад в 1)

Перші 2 ми вже додали, інші розглянемо трохи пізніше.
Отже, в xml ми створили новий конфіг, в який додали аспект, який посилається на бін. Оголосили 2 ради: до і після. Але стоп. Що таке pointcut ?!
Для того щоб привести АОП в дію, ми повинні обернути необхідний код в раду (и). Цей код називається join point або точка з'єднання, а pointcut є набором join points.

Як це працює, і навіщо це потрібно?

Аспектно-орієнтоване програмування в spring framework

Повернемося до нашому коду

Які параметри є у кожного тега я описувати не буду. Розповім лише про параметрі тега pointсut - expression.
execution означає, що аспект виконується тільки при запуску відповідного методу doSmth. Зірочка перед шляхом означає, що повертається значення може бути будь-який, а дві точки в дужках, що аргументи можуть бути будь-які. Ми також можемо вказувати шлях до інтерфейсу, а не класу. Тоді аспект буде працювати для всіх класів, які імплементують даний інтерфейс.

Отже ми розібралися, як все працює і для чого це потрібно. Так давайте запустимо наш додаток. Для цього створимо новий клас з методом main.
При запуску ми бачимо наступне:
Отже, не змінюючи інтерфейс і клас його реалізує, ми підключили логирование, яке запускається до і після виконання методу. А тепер давайте перевіримо роботу інших рад. Для цього створимо новий клас, назвемо його Worker:
Тепер змінимо наш xml файл: додамо новий бін і аспект з новими порадами.
І тепер метод main:
При запуску, з шансом 50% ми будемо бачити або
або
Тепер розберемося з останньою порадою, а саме around, який об'єднує кілька порад в один. Для цього додамо новий метод в клас Aspect:
Тепер повернемося до нашого Перформер і змінимо наш аспект в xml файлі.
Запустимо наше додаток вже від немає від Воркер, а перформера. Думаю, ви знаєте що робити;)
Після запуску ми повинні побачити:

Тим самим за допомогою around ми об'єднали всі 4 ради в 1.

висновок

АОП - потужний інструмент в руках розробника, який дозволяє винести наскрізний функціонал "за сцену" нашого застосування. А Spring AOP робить це максимально зручно і зрозуміло. Звичайно ж Spring AOP є не єдиним варіантом аспектно-орієнтованого програмування на мові Java, гідною альтернативою можу назвати AspectJ, але в цій статті я його розглядати не буду.

baxxabit Grishman rustock liberal4ik schyzoo publo fike lano4ka akmil VasilievAleksey SamTan Jack_killer Nadya2308 Garazd com alexvv iceknight serega123 error666 Nicolas_As jibiday GreyGoblin captian BeLucky