Лекция 7. Spring AOP
Аспектно-ориентированное программирование
АОП — парадигма программирования, являющаяся дальнейшим развитием процедурного и объектно-ориентированного программирования. Идея АОП заключается в выделении так называемой сквозной функциональности — кода, который повторяется в разных местах приложения (логирование, безопасность, транзакции, кэширование).
Ключевые понятия Spring AOP
Join Point — точка соединения
Join point — точки наблюдения, присоединения к коду, где планируется введение функциональности. Это конкретные места в программе, где может быть применён аспект (вызовы методов, обращения к полям и т.д.).
Pointcut — срез
Pointcut — срез, запрос точек присоединения. Может содержать одну или несколько точек.
Правила запросов очень разнообразные: запрос по аннотации на методе, по конкретному методу и т.д. Правила можно объединять через &&, ||, !.
Advice — совет
Advice — набор инструкций, выполняемых на точках среза (Pointcut). Инструкции можно выполнять по событиям разных типов:
| Тип Advice | Когда выполняется |
|---|---|
| Before | Перед вызовом метода |
| After | После вызова метода |
| After returning | После возврата значения из функции |
| After throwing | В случае exception |
| After finally | В случае выполнения блока finally |
| Around | Можно сделать пред- и пост-обработку, а также вообще обойти вызов метода |
На один Pointcut можно «повесить» несколько Advice разного типа.
Aspect — аспект
Aspect — модуль, в котором собраны описания Pointcut и Advice. По сути, это класс-контейнер для всей логики, связанной с одной сквозной функциональностью.
«If you want your code to be easy to write, make it easy to read.» — Robert C. Martin, Clean Code
Производительность Spring AOP
Всё происходит в рантайме, если не используются AspectJ-компиляторы, которые могут сгенерировать бины заранее (это называется Weaving, ткачество).
Реализация прокси в Spring AOP
Spring AOP использует два механизма прокси:
| Механизм | Когда используется |
|---|---|
| JDK Dynamic Proxy | По умолчанию. Используется, если целевой объект реализует хотя бы один интерфейс. Позволяет проксировать любой интерфейс (или их набор). |
| CGLIB Proxy | По умолчанию используется, если бизнес-объект не реализует ни одного интерфейса. |