Получить доступ

Что такое AOP в Spring и его ключевые понятия?

MiddleAOP и проксиSpring
Ещё спрашивают так:
  • Что такое аспект, advice и pointcut?
Коротко

AOP выносит сквозную функциональность (транзакции, безопасность, логирование, метрики) из бизнес-кода в аспекты. Advice — что и когда выполнить; pointcut — где; join point — конкретная точка (в Spring — вызов метода).

  • Виды advice: @Before, @After, @AfterReturning, @AfterThrowing, @Around
  • Spring AOP — на прокси: только методы бинов, только внешние вызовы
  • @Transactional, @Async, @Cacheable — тоже аспекты

А ещё AspectJ умеет больше (поля, конструкторы, self-invocation), но требует weaving

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Проблема: одинаковый код (транзакции, проверка прав, логирование, замер времени) повторяется в сотнях методов и смешивается с бизнес-логикой.

Понятия:

  • аспект — модуль со сквозной логикой (@Aspect);
  • join point — точка выполнения, куда можно встроиться; в Spring AOP — только вызов метода бина;
  • pointcut — выражение, выбирающее join points: execution(* com.shop.service..*(..)), @annotation(Audited);
  • advice — код и момент выполнения: до, после, после успеха, после исключения, вокруг (@Around с ProceedingJoinPoint.proceed()).

Реализация в Spring: для бинов, к которым подходят pointcut, создаётся прокси (JDK dynamic proxy или CGLIB). Вызов идёт через прокси, который выполняет advice и вызывает метод.

Ограничения прокси: не перехватываются вызовы внутри объекта (this.method()), private-методы, final-методы для CGLIB, объекты не из контейнера.

Пример

@Aspect @Component
class TimingAspect {
    @Around("@annotation(com.shop.Timed)")
    Object time(ProceedingJoinPoint pjp) throws Throwable {
        long t = System.nanoTime();
        try { return pjp.proceed(); }
        finally { log.info("{} {} мс", pjp.getSignature(), (System.nanoTime() - t) / 1_000_000); }
    }
}

Что хотят услышать

  • Сквозная функциональность как мотивация.
  • Аспект, advice, pointcut, join point.
  • Прокси и их ограничения.

Частые ошибки

  • Ожидать срабатывания аспекта при self-invocation.

Что спросят дальше

  • Чем around отличается от before/after?
  • Где типично применяют AOP?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем