Когда мы рассматривали модули Spring Framework, мы упоминали об Аспекто-ориентированном программировании (далее — АОП). АОП является одним из ключевых компонентов Spring. Смысл АОП заключается в том, что бизнес-логика приложения разбивается не на объекты, а на «отношения» (concerns).
Прим. в русском языке крайне сложно подобрать перевод слова «concern» так, чтобы оно передавало смысл этого слова в контексте АОП.
Функции, которые охватывают несколько точек приложения называются «cross-cutting concerns» или сквозной (комплексной) проблемой и они отделены от самой бизнес-логики приложения.
Ключевой единицей в ООП является «объект», а ключевой единицей в АОП — «аспект». В качестве примера «аспекта» можно привести безопасность, кэширование, логирование и т.д. Внедрений зависимостей (DI) позволяет нам отделять объекты приложения друг от друга. АОП, в свою очередь, позволяет нам отделять сквозные проблемы (cross-cuttings) от объектов, к которым они относятся.
Модуль AOP в Spring обеспечивает нас такими сущностями, как «перехватчики» (interceptors) для перехвата приложения в определённые моменты. Например, когда выполняется определённый метод, мы можем добавить какую-то функциональность (к примеру, сделать запись в лог-файл приложения) как до, так и после выполнения метода.
Для понимания АОП, нам прежде всего необходимо ознакомиться с ключевыми понятиями и терминами АОП:
Аспект (Aspect)
Это модуль, который имеет набор программных интерфейсов, обеспечивающих сквозные требования. К примеру, модуль логирования будет вызывать АОП аспект для логирования. В зависимости от требований, приложение может иметь любое количество аспектов.
Объединённая точка (Join point)
Это такая точка в приложении, где мы можем подключить аспект. Другими словами, это место, где начинаются определённые действия модуля АОП в Spring.
Совет (Advice)
Это фактическое действие, которое должно быть предпринято до и/или после выполнения метода. Это конкретный код, который вызывается во время выполнения программы.
Срез точек (Pointcut)
Срезом называется несколько объединённых точек (join points), в котором должен быть выполнен совет.
Введение (Introduction)
Это сущность, которая помогает нам добавлять новые атрибуты и/или методы в уже существующие классы.
Целевой объект (Target object)
Это объект на который направлены один или несколько аспектов.
Плетение (Weaving)
Это процесс связывания аспектов с другими объектами приложения для создания совета. Может быть вызван во время компиляции, загрузки или выполнения приложения.
Существует несколько типов советов (advice):
before
Запускает совет перед выполнением метода.
after
Запускает совет после выполнения метода, независимо от результата его работы (кроме случая остановки работы JVM).
after-returning
Запускает совет после выполнения метода, только в случае его успешного выполнения.
after-throwing
Запускает совет после выполнения метода, только в случае, когда этот метод «бросает» исключение.
around
Запускает совет до и после выполнения метода.
В Spring поддерживаются 2 подхода для реализации АОП:
Основанный на XML (пример приложения)
Применяется конфигурация с помощью конфигурационного XML-файла.
Основанный на аннотациях @AspectJ (пример приложения)
Применяется конфигурация с помощью аннотации
Настоятельно рекомендую ознакомиться с примерами приложений, которые приведены выше по ссылкам. Ссылки на примеры приложений: