Есть Spring Bean с двумя методами A и B, над обоими аннотации. Как вызвать метод B из метода A, чтобы аннотации сработали?

Для proxy-based аннотаций Spring метод B должен вызываться через Spring-прокси. Практичный вариант — вынести B в отдельный bean и внедрить его в bean с методом A.

Короткий ответ

Что ответить на собеседовании

Для proxy-based аннотаций Spring метод B должен вызываться через Spring-прокси. Практичный вариант — вынести B в отдельный bean и внедрить его в bean с методом A.

Подробный разбор

Ответ с пояснениями

Для proxy-based аннотаций Spring метод B должен вызываться через Spring-прокси. Практичный вариант — вынести B в отдельный bean и внедрить его в bean с методом A.

Вызов this.B() обходит прокси, поэтому отдельные настройки @Transactional, @Async или @Cacheable не будут перехвачены таким способом. При этом уже открытая транзакция A может продолжать действовать: отсутствие нового перехвата не означает отсутствия любой транзакции. Проверьте конкретную аннотацию, включённую инфраструктуру и доступность метода для используемого типа прокси. Разделение ответственности обычно понятнее self-injection; AspectJ weaving имеет другую модель перехвата.

Источник: docs.spring.io.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее