TGViewer
YeaHub Tech YeaHub Tech @yeahub_tech · 412 subscribers
Post #241 178
#Spring

🔖 Тайна игнорируемых Spring-аннотаций

Удивительно, как работают аннотации Spring вроде @Transactional, @Cacheable, @Async. Но что происходит, когда они внезапно «отказываются» работать?


Проблема кэширования

При создании службы уведомлений по email мы решили кэшировать дорогостоящую генерацию шаблонов с помощью @Cacheable. Но в тестах обнаружилось: кэширование не работает! Метод выполнялся заново при каждом вызове, словно аннотация невидима для Spring.


Секрет прокси

Изучив документацию Spring, мы узнали главное: функционал аннотаций поддерживается через прокси — специальные объекты-обертки, перехватывающие вызовы методов. Но есть важный нюанс: прокси не перехватывают внутренние вызовы.

Когда метод с @Cacheable вызывается напрямую из другого метода того же класса, он выполняется в обход прокси. Отсюда и проблема с кэшированием.


Решение через разделение

Проблема решается просто — вынесением кэшируемого метода в отдельную службу. Теперь вызов проходит через прокси, и кэширование работает как ожидалось.


Два типа прокси

В Spring используются два вида прокси:

Динамические прокси JDK реализуют тот же интерфейс и делегируют вызовы. Применяются по умолчанию для классов с интерфейсами.

Прокси CGLIB создают подкласс целевого класса и переопределяют методы. Используются для конкретных классов без интерфейсов.

Выбором прокси можно управлять через конфигурацию, но обычно стандартного поведения достаточно.


Главное — помнить: Spring-аннотации работают только через прокси. Избегайте внутренних вызовов, выносите функционал в отдельные компоненты, используйте только публичные методы.


Понимание механизма прокси Spring сэкономит часы отладки при работе с транзакциями, кэшированием и асинхронными операциями.


📎 Статья

🎙 Новости

📝 База вопросов
  • 👍 1
More from @yeahub_tech
  1. Oct 9, 2026#Собес #pipeline #ci #stage 🤔 Что происходит при автоматической сборке feature-ветки на s…
  2. Oct 8, 2026#course #задачи #тесты 📚 JavaScript. A3 Задачи Задачи на программирования на языке JavaSc…
  3. Oct 7, 2026#course #начинающие 📚 Твой Golang Твой Golang — это идеальный старт для освоения языка. П…
  4. Oct 5, 2026🧑‍💻 Вопросы с собесов для Node.js Разработчика 1. Как использовать Service Workers для р…
  5. Oct 2, 2026#Собес #transaction #propagation #required 🤔 Что такое propagation у транзакций и какие т…
  6. Oct 1, 2026#book #book 📚 Библия C#. 6-е изд. Автор: Михаил Фленов Это настольная книга программиста,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →