Какие ограничения есть у Spring AOP из-за того, что он основан на прокси?
- Почему аспект не срабатывает?
Spring AOP на прокси перехватывает только внешние вызовы публичных методов бинов: не работает self-invocation, private-методы, final-методы и классы при CGLIB, объекты не из контейнера, поля.
- this.method() идёт мимо прокси
- @PostConstruct вызывается до появления прокси
- AspectJ weaving снимает ограничения, но усложняет сборку
А ещё Проверить, что бин — прокси: AopUtils.isAopProxy(bean)
Подробно
Spring AOP поддерживает единственный вид точки соединения — выполнение метода, поэтому доступ к полям и вызовы конструкторов не перехватываются: для этого нужен полноценный AspectJ с плетением байткода. Отсюда же вытекает большинство вопросов «почему не работает @Transactional»: вызвали метод изнутри класса, объявили его private, или класс оказался final. Практические обходы: вынести метод в отдельный бин, внедрить в себя ссылку на прокси через ObjectProvider или использовать AopContext.currentProxy(), а в крайнем случае перейти на AspectJ. Первый вариант почти всегда лучше — необходимость самовызова обычно означает, что в классе смешаны две ответственности.
Что хотят услышать
- Перечень ограничений и причина.
- Как обойти.
Частые ошибки
- Ставить @Transactional на private-метод и ждать транзакции.
- Пытаться перехватить доступ к полю средствами Spring AOP.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Вызов метода изнутри того же объекта проходит мимо аспекта
- ✓Private-методы перехватить нельзя
- ✓CGLIB не проксирует final-классы и final-методы
- ✗Точками среза могут быть обращения к полям объекта, как в полноценном AspectJ с weaving
Что спросят дальше
- Как правильно обойти проблему self-invocation?
- Чем плетение AspectJ отличается от прокси?
Разбор темы
- AOP: прокси и аспекты
Сквозная функциональность, понятия aspect/advice/pointcut/join point, JDK против CGLIB прокси, self-invocation и что на AOP построено.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.