SPRING-SOURCE.RU
  1. Определение АОП. История возникновения
  2. Пример аспекта
  3. Pointcut и Joint points
  4. Advice

Определение АОП. История возникновения

Введение

АОП позволяет компоновать программы из взаимно пересекающихся блоков (crosscutting concerns).

АОП вводит в действие аспекты (aspects). Они инкапсулируют особенности поведения взаимно влияющих друг на друга классов в составе повторно используемых модулей.

Теперь давайте определимся с тем, что является модульной единицей. Модуль - это как класс. Аспект, как модуль, включает в себя тот функционал, который нельзя вынести в отдельный класс, потому что он находится внутри нескольких классов. Отсюда и появился термин crosscutting concerns, когда функционал пересекает границы классов.

Примеры

Обсудим на примере логирования. Есть система, например, web магазин и мы хотим писать логи. Можно написать класс логирования и включать его во все наши классы, можно сделать через наследование, то есть все наши классы будут наследоваться от одного класса, где прописаны функции логирования. А что, если классы уже наследуются. Как быть в этом случае? У нас есть, например, два сервиса: первый добавляет товары в корзину, а второй сервис – работа с товарами. Как эти сервисы пересекаются между собой? Никак. У них даже разные права доступа. Это два разных класса, с точки зрения объектно-ориентированного программирования. Но в обоих классах есть функции, которые по смыслу к ним не относятся – это функции логирования. Как мы обычно пишем логи? Мы прямо в методах основного класса прописываем все, что нам нужно для того, чтобы собирать информацию. Отсюда получается, что наша логика засоряется абсолютно другой логикой не имеющей никакого отношения к этой логике. Как здесь разделить функциональность?

Еще один пример: была программа, она работала хорошо и занимала около 1000 строк кода. Решили в эту программу добавить управление транзакциями, логирование, проверку прав пользователей. Расширили не логику, а только возможности и после этого программа стала занимать 30.000 строк. Когда к этой же программе применили АОП, то программа стала занимать 1500 строк. Здесь 500 строк было вынесено в отдельный аспект. 1000 строк как было, так и осталось, логика не менялась.

Определения

Aspect — определение, некоторого набора сквозной функциональности, нацеленной на конкретную задачу. Также как и классы, разный функционал по разным аспектам.

Pointcut — код применимости аспекта. Отвечает на вопросы где и когда может быть применена функциональность данного аспекта. То есть описывает, где и в каком месте этот аспект будет применяться. Места: метод, конструктор, вызов метода или вызов метода внутри какого-то метода.

Advice — код функциональности объекта. Непосредственно код функциональности для заданных событий. Другими словами, это то, что будет выполнено для объектов, указанных в Pointcut. Другими словами - это то, что будет выполнятся в pointcut месте.