Лекция 7

01.01.0001

Лекция 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По умолчанию используется, если бизнес-объект не реализует ни одного интерфейса.