Ответ вслух Senior AOP и прокси обновлено

Свой аспект: когда и как

Вопрос

Когда вы бы написали свой аспект? Приведите пример и расскажите о подводных камнях.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Аспект беру для действительно сквозной логики: аудит действий, метрики времени выполнения, единообразная проверка прав или идемпотентность по ключу. Например, аннотация @Audited и аспект с @Around("@annotation(audited)"), который пишет в журнал, кто и что вызвал, обязательно возвращая pjp.proceed().

Что должно прозвучать в ответе

  • Сквозная логика: аудит, метрики, логирование, проверка прав

  • Pointcut по своей аннотации, @Around с proceed

  • Аспект должен быть бином (@Component) и включён AOP

  • Ограничения прокси: this-вызовы, private, final

  • Порядок аспектов через @Order

  • Не прятать бизнес-логику в аспектах

Что могут спросить следом

  • Чем аспект лучше декоратора или фильтра?
  • Как протестировать аспект?

Разбор

Аспект беру для действительно сквозной логики: аудит действий, метрики времени выполнения, единообразная проверка прав или идемпотентность по ключу. Например, аннотация @Audited и аспект с @Around("@annotation(audited)"), который пишет в журнал, кто и что вызвал, обязательно возвращая pjp.proceed(). Аспект объявляю бином, в Boot AOP-стартер включает автопроксирование. Помню ограничения: внутренние вызовы через this и private-методы аспект не увидит. Если на методе несколько аспектов, явно задаю @Order, иначе порядок с транзакцией непредсказуем. Бизнес-логику в аспекты не прячу: код становится неочевидным. Тестирую аспект интеграционно, со Spring-контекстом, или через AspectJProxyFactory в юнит-тесте.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме