Что такое AOP в 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?
Разбор темы
- AOP: прокси и аспекты
Сквозная функциональность, понятия aspect/advice/pointcut/join point, JDK против CGLIB прокси, self-invocation и что на AOP построено.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.