Найти в Дзене
Записки о Java

Spring AOP (Aspect-Oriented Programming)

Поговорим о Spring AOP — мощном инструменте, который позволяет выносить сквозную функциональность из бизнес-логики.
Это как если бы вы могли добавить логирование, транзакции или безопасность в любые методы — без изменения их кода. Разберём: AOP (Aspect-Oriented Programming) — это парадигма программирования, которая позволяет разделить основную бизнес-логику и сквозную (cross-cutting) функциональность. Это код, который повторяется во многих местах, но не относится напрямую к бизнес-логике: Без AOP такой код "размазывается" по всему приложению → дублирование, сложность поддержки. 💡 AOP позволяет внедрить эту логику автоматически, не загрязняя основной код. Aspect Модуль сквозной функциональности (например, "логирование") Joinpoint Точка в программе, где можно применить аспект (например, вызов метода) Advice Действие, которое выполняется в Joinpoint (например, "запиши в лог") Pointcut Выражение, определяющее, к каким Joinpoint'амприменяется Advice Weaving Процесс применения аспектов
Оглавление
Рисунок: Spring AOP
Рисунок: Spring AOP

Введение

Поговорим о Spring AOP — мощном инструменте, который позволяет выносить сквозную функциональность из бизнес-логики.
Это как если бы вы могли добавить логирование, транзакции или безопасность в любые методы —
без изменения их кода.

Разберём:

  • Что такое AOP?
  • Ключевые термины: Aspect, Joinpoint, Advice, Pointcut
  • Как реализовать AOP в Spring
  • Практический пример: автоматическое логирование всех вызовов сервисов

Что такое AOP?

AOP (Aspect-Oriented Programming) — это парадигма программирования, которая позволяет разделить основную бизнес-логику и сквозную (cross-cutting) функциональность.

Что такое "сквозная функциональность"?

Это код, который повторяется во многих местах, но не относится напрямую к бизнес-логике:

  • Сквозная функция: Логирование
  • Пример: Запись в лог перед/после вызова метода

  • Сквозная функция: Транзакции
  • Пример: @Transactional— начало и завершение транзакции

  • Сквозная функция: Безопасность
  • Пример: Проверка прав доступа

  • Сквозная функция: Измерение времени
  • Пример: Сколько выполнялся метод?

  • Сквозная функция: Обработка ошибок
  • Пример: Перехват исключений

Без AOP такой код "размазывается" по всему приложению → дублирование, сложность поддержки.

💡 AOP позволяет внедрить эту логику автоматически, не загрязняя основной код.

📚 Основные термины AOP

Aspect

Модуль сквозной функциональности (например, "логирование")

Joinpoint

Точка в программе, где можно применить аспект (например, вызов метода)

Advice

Действие, которое выполняется в Joinpoint (например, "запиши в лог")

Pointcut

Выражение, определяющее, к каким Joinpoint'амприменяется Advice

Weaving

Процесс применения аспектов к приложению

⚙Виды Advice

@Before

Перед методом

@After

После метода (в любом случае)

@AfterReturning

Только если метод завершился успешно

@AfterThrowing

Только если метод бросил исключение

@Around

До, во время и после метода (максимальный контроль)

Настройка AOP в Spring

1. Добавьте зависимость в pom.xml

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-aop</artifactId>

</dependency>

✅ Это всё, что нужно! Spring автоматически включит AOP.

✅ Практика: Логирование всех вызовов сервисов

Шаг 1: Создадим аспект

Рисунок: создание аспекта - часть 1
Рисунок: создание аспекта - часть 1
Рисунок: создание аспекта - часть 2
Рисунок: создание аспекта - часть 2

Ограничения AOP в Spring

  • Работает только для бинов Spring
  • Не работает для private методов
  • Не работает, если метод вызывается внутри того же класса (из-за прокси)

Объясняю, как пятилетнему

Представь, что у тебя есть робот, который моет полы.
Ты хочешь, чтобы каждый раз, когда он начинает мыть:

  • Он говорил: «Начинаю!»
  • По окончании: «Готово!»
  • Если упадёт: «Помогите!»

Ты не будешь переписывать весь код робота.
Ты просто
подключишь микрофон и колонку, которые будут говорить за него.

AOP — это как этот микрофон.
Он
слушает, что делает робот, и говорит от его имени.

Заключение

Пример, рассмотренный в статье, можно найти по адресу:

https://github.com/ShkrylAndrei/blog_yandex/tree/main/src/main/java/info/shkryl/aop