Вопрос с собеседования · Spring

Что такое 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

Подробно

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

Понятия:

  • аспект — модуль со сквозной логикой (@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.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Вынос сквозной функциональности в аспекты: advice — что, pointcut — где, join point — вызов метода
  • ✗Механизм внедрения зависимостей через конструктор
  • ✗Генерация репозиториев по именам методов
  • ✗Перехват любых вызовов, включая вызовы внутри того же бина и обращения к полям, без прокси и сборки

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

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

Разбор собеседования