Когда мы рассматривали модули 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 (пример приложения)
Применяется конфигурация с помощью аннотации
Настоятельно рекомендую ознакомиться с примерами приложений, которые приведены выше по ссылкам. Ссылки на примеры приложений: