Spring АйО
Русскоязычное сообщество Spring-разработчиков. Habr: bit.ly/433IK46 YouTube: bit.ly/4h3Ci0x VK: bit.ly/4hF0OG8 Rutube: bit.ly/4b4UeX6 Яндекс Музыка: bit.ly/3EIizWy Чат для общения: @spring_aio_chat По вопросам сотрудничества: @befayer
显示更多📈 Telegram 频道 Spring АйО 的分析概览
频道 Spring АйО (@spring_aio) 是活跃参与者。目前社区聚集了 10 926 名订阅者,在 技术与应用 类别中位列第 11 319,并在 俄罗斯 地区排名第 59 765 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 10 926 名订阅者。
根据 24 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 73,过去 24 小时变化为 1,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 57.34%。内容发布后 24 小时内通常能获得 25.34% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 6 265 次浏览,首日通常累积 2 769 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 40。
- 主题关注点: 内容集中在 айо, хабр, api, jep, amplicode 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“Русскоязычное сообщество Spring-разработчиков.
Habr: bit.ly/433IK46
YouTube: bit.ly/4h3Ci0x
VK: bit.ly/4hF0OG8
Rutube: bit.ly/4b4UeX6
Яндекс Музыка: bit.ly/3EIizWy
Чат для общения: @spring_aio_chat
По вопросам сотрудничества: @befayer”
凭借高频更新(最新数据采集于 25 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
Point. Сейчас это обычно не миллион точек подряд, а миллион ссылок на объекты в куче. У каждого объекта есть служебные данные, его нужно создать, потом убрать сборщиком мусора. Плюс процессор постоянно прыгает по памяти, а это медленно.
Project Valhalla добавляет value class. Это обычный на вид класс с полями, конструктором и методами, но без идентичности объекта. JVM сможет хранить такие данные плотнее: например, прямо внутри массива, без отдельного объекта для каждого значения.
JEP 401 планируют включить в JDK 28 как preview. Это еще не финал: value class пока может быть null, а полная поддержка быстрых generics и плотных коллекций появится позже. Но первый рабочий шаг Valhalla уже близко.
📎 Статья целиком: https://habr.com/ru/companies/spring_aio/articles/1050938/FetchType.LAZY на всех *ToOne связях, уверены, что лишних запросов в БД нет — и тут в логах всплывает необъяснимый SELECT, который вы не просили.
Особенно обидно, когда это @OneToOne: на @ManyToOne ровно тот же LAZY работает железно и всегда, а здесь Hibernate вдруг идёт в базу eagerly, будто вашей аннотации и не было.
А самое неприятное — большинство объяснений в сети сводятся к тому, что просто так уж устроено, но главный вопрос "Почему?" остается без ответа. Почему один и тот же LAZY в одном
случае работает, а в другом молча игнорируется?
В новой статье Михаил Поливаха, разбирает по полочкам:
☑️ Что на самом деле такое FetchType.LAZY и почему это всего лишь hint, а не приказ;
☑️ Почему @OneToOne иногда невозможно сделать lazy именно в Java;
☑️ Почему @ManyToOne при этом ленив всегда — и при чём тут владение связью и foreign key;
☑️ Как с этим жить: optional = false, дизайн схемы, @MapsId и другое.
📎 Подробнее в статье на Хабр: https://habr.com/ru/companies/spring_aio/articles/1050462/Запускаю State of Production Engineering 2026 - исследование о том, как команды разработки живут в ПРОДе. Это не опрос про Java. Не опрос про Kubernetes. Не опрос про DevOps. И не "какой инструмент observability вы используете". Смотрим шире: - архитектура и владение - поставка и безопасность релизов - управление инцидентами - observability как способность расследовать, а не просто смотреть графики - resilience - данные - рантайм и работа с платформой - AI в процессе SDLC - инженерная культура - стоимость инцидентов, даунтаймы и надежность. Основная идея проста: зрелость production engineering - это не наличие инструментов, а способность команды управляемо проводить изменение от идеи до стабильной эксплуатации в ПРОДе. Нужны ответы людей, которые действительно связаны с ПРОДом: CTO, Head of Engineering, тимлиды, архитекторы, разработчики, SRE, DevOps, QA лиды, delivery/product менеджеры - все, кто участвует в релизах, инцидентах, эксплуатации, архитектурных решениях и инженерных процессах. Анкета занимает примерно 10–15 минут. Можно отвечать без имени и компании. По итогам подготовлю публичный отчет и бенчмарки по зрелости production engineering. Ваш опыт очень важен.Пройти опрос: State of Production Engineering 2026
spring.datasource.connection-fetch=lazyСмысл такой, что нет SQL — нет connection. То есть раньше приложение брало connection на всякий случай. А теперь только когда он реально нужен. ⚠️ Обратите внимание, что данная настройка работает не только с Hibernate. Более того, вообще любая блокирующая технология доступа к БД в экосистеме Spring (
JdbcClient, Spring Data JDBC и т.д.) может работать с этой фичей.
Происходит это потому, что под капотом используется LazyConnectionDataSourceProxy, который, на самом деле, существует давно. Просто раньше надо было знать о нем, лезть в конфиг и руками оборачивать DataSource.
В итоге, где это реально имеет смысл:
— широкие @Transactional границы;
— early-return без похода в БД;
— нагрузка, где каждый idle connection уже начинает стоить дорого.
Флаг довольно удобный. Имейте в виду!-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY---—Его используют OpenSSL, certificate authorities, OpenSSH, YubiKey и еще куча инфраструктурных инструментов. Проблема в том, что Java давно умеет работать с криптографическими объектами —
PublicKey, PrivateKey, X509Certificate, X509CRL, — но вот удобного стандартного API для PEM до сих пор не хватало.
Раньше нам, разработчикам, часто приходилось делать все ручками, например, убирать BEGIN/END, декодировать Base64, изучать алгоритм ключа, выбирать нужный KeyFactory или CertificateFactory, а для encrypted private key еще и писать отдельную пачку кода. Вообще в криптографии самодельный парсер – не самое подходящее место, где нужно показывать свою творческую натуру)
Так вот, JEP 538 добавляет в java.security несколько новых сущностей:
–Пример становится сильно проще:PEMEncoder— кодирует криптографические объекты в PEM; –PEMDecoder— декодирует PEM обратно в Java-объекты; –BinaryEncodable— общий маркер для объектов, которые можно представить в бинарном виде и завернуть в PEM; – PEM — универсальный контейнер для PEM-данных, если для конкретного типа нет отдельного Java API; –CryptoException— runtime-исключение для криптографических ошибок.
PEMEncoder encoder = PEMEncoder.of();
String pem = encoder.encodeToString(publicKey);
И обратно:
PEMDecoder decoder = PEMDecoder.of();
PublicKey key = decoder.decode(pem, PublicKey.class);
Еще отдельно улучшили работу с зашифрованными приватными ключами. PEMEncoder можно настроить через withEncryption(password), а PEMDecoder — через withDecryption(password). Для более продвинутых сценариев расширили EncryptedPrivateKeyInfo. Там появились методы для шифрования BinaryEncodable, получения PrivateKey и даже KeyPair, если внутри есть и публичная, и приватная часть.
В третьем preview есть и небольшие, но важные изменения по API:
– PEM теперь обычный класс, а не record — это дает разработчикам OpenJDK больше гибкости для дальнейшего развития API без ограничений, которые накладывает неизменяемая структура record; –Главная идея такая, что работа с PEM должна быть стандартной, короткой и менее хрупкой. Не ручками, а через нормальный API платформы. Но это все еще preview API! В JDK 27 его нужно включать черезDEREncodableпереименован вBinaryEncodable— название стало точнее отражать назначение интерфейса: он работает не только с DER-представлением, а с бинарным кодированием в целом, что делает API понятнее для разработчиков; –PEMDecoder.withFactory(...)сталwithFactoriesOf(...)— новое имя лучше показывает, что метод может работать с несколькими фабриками объектов, повышая читаемость и снижая вероятность неправильного понимания API; – добавленCryptoException— единое runtime-исключение упрощает обработку криптографических ошибок и избавляет от необходимости разбираться с большим количеством специализированных исключений в типовых сценариях; – в PEM появились конструкторы, принимающие Base64-контент в byte[] — это позволяет работать с уже загруженными или полученными по сети данными без лишних преобразований в строки, что делает код проще и потенциально эффективнее.
--enable-preview, да и сигнатуры еще могут поменяться. Круто, что Java постепенно забирает в стандартную библиотеку то, что раньше приходилось решать руками или внешними зависимостями.
Полезная или проходная фича?Знать Spring Data JPA должен любой Spring-разработчик. Ждём того же от AI-агента.
Справляются ли с этим современные модели? Смотря какие.
Opus 4.8 ошибается реже остальных, но и он не идеален: вчера агент настроил связь между сущностями правильно, а сегодня на той же задаче добавил CascadeType.ALL 🤦♂️.
Skills, которые объясняют агенту особенности фреймворка, значительно поднимают качество кода у моделей среднего класса. На отдельных задачах такие скиллы подтягивают Haiku почти до уровня Opus!
Этому и посвящён скилл недели.
📚 Какие ошибки агенты чаще допускают с JPA и как их избежать, разобрали в статье на Хабре.JEP 401 is the smallest piece of Valhalla that we can ship on its ownЭто, вероятно, один из самых важных и больших JEP-ов, которые попадут в mainline JDK. Там PR на 200+ тысяч строк кода, я не шучу. Тем не менее, такие вещи, как: - Null-Restricted типы, наподобие
String! (Ссылка, типа String! не может указывать на null)
- Примитивы в качестве Generic типов, т.е. вещи, наподобие List<int> (не List<Integer>)
и ряд других - они попадут в mainline в качестве preview позже.
Тем не менее, это крайне значимый шаг. Будем держать Вас в курсе!Order вместе с OrderItem не мог безопасно ограничиться на уровне SQL. Из-за join один заказ мог превратиться в несколько строк, и limit мог обрезать коллекцию. Поэтому Hibernate загружал все подходящие строки, а страницу выбирал уже в памяти. На больших данных это, конечно же, било по памяти и могло закончиться OutOfMemoryException. Да и в целом не очень перформансно это, согласитесь.
Дождались, и теперь Hibernate сначала выбирает нужные id родительских сущностей во вложенном запросе, а затем загружает для них полные дочерние коллекции. Пагинация остается в БД, данные не режутся.
Еще в 7.4 появились history и audit tables. @Temporal хранит версии строк и позволяет читать сущность на конкретный момент времени. @Audited пишет изменения ADD/MOD/DEL в audit-таблицу без Envers.
📎 Полный текст: https://habr.com/ru/companies/spring_aio/articles/1047844/— Упростили работу с tools Теперь Spring AI лучше работает со сценариями, где модель должна вызывать внешние функции и инструменты. Плюс появился механизм, который помогает не отправлять модели сразу все доступные инструменты, а подбирать только нужные. Это полезно, когда инструментов много и не хочется засорять контекст. — Сильнее прокачали MCP Spring AI обновился до MCP SDK 2.0 и в целом стал лучше встроен в историю с MCP. Для тех, кто смотрит в сторону AI-приложений с внешними инструментами и сервисами, это важный шаг. — Обновили интеграцию с OpenAI Под капотом Spring AI теперь использует официальный Java SDK от OpenAI. Для разработчиков это обычно хороший знак: меньше самодельных решений, больше стабильности и предсказуемости. — Привели в порядок память чата Проще говоря, Spring AI стал аккуратнее хранить историю сообщений. Это значит, что в реальных приложениях меньше шансов получить путаницу в сообщениях, неправильный порядок ответов и странное поведение модели. — Сделали настройки более понятными Меньше неявной магии, больше прозрачности. Некоторые настройки теперь работают предсказуемее, и поведение модели проще контролировать явно.В общем стало больше предсказуемости, лучше интеграция со Spring-стеком, меньше неявного поведения в чувствительных местах вроде tool calling, memory и MCP. Помним, что это major release. Переход с 1.1.x потребует внимательного апгрейда: breaking changes есть в tool calling, memory, MCP и конфигурации. 📎 Документация по 2.0.0 📎 Документация по переезду с 1.1.х на 2.0.0 ❓ Кто-то использует Spring AI в реальных сервисах? Или еще подождем?
getXXX(), который вроде бы просто геттер, отдающий данные наружу.
Но проблема в том, что в этот момент наружу может утекать изменяемое внутреннее состояние объекта. А значит, ломается инкапсуляция, начинают нарушаться инварианты, а баги в таких местах потом дебажатся мучительно долго. Для библиотек и платформенного кода это ещё опаснее: однажды такой API становится публичным контрактом, и цена ошибки вырастает в разы.
И самое неприятное, что на этом история не заканчивается: подобные решения иногда расширяют attack surface системы и в плохом сценарии становятся частью куда более серьёзных инцидентов. В новой статье разбираю именно такой случай на простом Java-примере и показываю, почему эта ошибка в дизайне API может стоить очень дорого. Если вам близки темы Java, Spring и аккуратного API-дизайна, почитайте, статья небольшая 😉
📎 Читать на Хабр:
https://habr.com/ru/companies/spring_aio/articles/1046620/Как вы знаете, первичное наполнение контекста — крайне важная задача. При этом все популярные агенты (Claude Code, Codex, OpenCode и т. д.) выполняют ее без какого-либо понимания, как устроены приложения, написанные на Spring. Как результат: не находятся бины, дублируются компоненты, снижается скорость работы и растет расход токенов. Эти проблемы как раз и призван решить данный скилл.📚 Погружаемся в Spring Explore на Хабре: https://habr.com/ru/companies/haulmont/articles/1041314/
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
