Руководство по Spring. АОП в Spring Framework.

Когда мы рассматривали модули 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 (пример приложения)

Применяется конфигурация с помощью аннотации

Настоятельно рекомендую ознакомиться с примерами приложений, которые приведены выше по ссылкам. Ссылки на примеры приложений:

XML

AspectJ