Какие виды advice существуют в Spring AOP?
- Какие бывают advice в AspectJ-аннотациях Spring?
@Before — до метода, @AfterReturning — после успешного возврата, @AfterThrowing — после исключения, @After — в любом случае (как finally), @Around — вокруг, с вызовом proceed().
- @Around — самый мощный: может изменить аргументы, результат, не вызвать метод
- Забыть proceed() в @Around — метод не выполнится
- Выбирать самый простой подходящий вид
А ещё @Transactional и @Cacheable устроены как around-advice
Подробно
Самый мощный — @Around: он получает ProceedingJoinPoint и сам решает, вызывать ли целевой метод, что и делает возможными кэширование, ретраи и circuit breaker. Именно поэтому важно не забыть вернуть результат proceed() — типичная ошибка, из-за которой метод возвращает null. Остальные виды проще и безопаснее, и правило хорошего тона — брать наименее мощный из подходящих. Порядок при нескольких аспектах задаётся через @Order, а сама аннотация @Transactional реализована ровно этим механизмом.
Что хотят услышать
- Пять видов и когда срабатывает каждый.
- Особенности @Around.
Частые ошибки
- Забыть вернуть результат proceed() в @Around.
- Использовать @Around там, где достаточно @Before.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓@Before и @After — до вызова и после в любом случае
- ✓@AfterReturning и @AfterThrowing — после возврата и после исключения
- ✓@Around — оборачивает вызов и может не вызывать метод
- ✗@Instead — заменяет тело метода целиком, а исходная реализация вызывается только явно через proceed()
Что спросят дальше
- Что можно сделать с исключением внутри @Around?
- Как задать порядок нескольких аспектов на одном методе?
Разбор темы
- AOP: прокси и аспекты
Сквозная функциональность, понятия aspect/advice/pointcut/join point, JDK против CGLIB прокси, self-invocation и что на AOP построено.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.