Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: self invocation, transactional

Что такое self-invocation в Spring?

Вопрос проверяет понимание AOP-прокси и причин, по которым аннотации могут «не срабатывать».

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

Self-invocation — это вызов метода бина из другого метода того же бина. Такой вызов происходит напрямую, минуя прокси Spring. В результате AOP-аннотации не применяются. Это часто приводит к тому, что @Transactional или @Async не работают. Проблема неочевидна и часто встречается на практике.

Длинный ответ

Self-invocation — следствие прокси-модели Spring.

Что происходит при self-invocation

Когда бин вызывает свой же метод:

  • вызов идет через this

  • прокси не участвует

  • AOP-логика пропускается

Это относится к:

  • @Transactional

  • @Async

  • @Cacheable

  • другим AOP-аннотациям

Пример проблемы

public void methodA() {
    methodB(); // @Transactional на methodB не сработает
}

Почему Spring так устроен

Spring:

  • оборачивает бин в прокси

  • перехватывает внешние вызовы

  • не перехватывает внутренние вызовы объекта

Это компромисс между простотой и производительностью.

Как обходить проблему

Основные подходы:

  • вынести метод в отдельный бин

  • вызывать бин через интерфейс

  • использовать ApplicationContext (не рекомендуется)

  • применять AspectJ weaving

Практический вывод

Self-invocation:

  • не баг Spring

  • а архитектурное ограничение

  • которое нужно учитывать при проектировании

Вывод: self-invocation ломает AOP-аннотации, потому что внутренние вызовы обходят прокси Spring.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Spring

    Spring

Ключевые слова

#self invocation

#transactional

Подпишись на Java Developer в телеграм