Всем привет! 👋👋👋👋👋

Мы — Java-разработчики Т-Банка: Андрей, Арсений, Роман, Константин и Константин. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и делимся этим со всем сообществом.

Главные новости

Java 26 вышла! Релиз состоялся 17 марта 2026 года. Первый non-LTS после JDK 25. В составе 10 JEPs: 5 финальных и 5 в preview/incubator. Из preview-фич: Structured Concurrency (6-й preview, шестой, Карл!), Lazy Constants (2-й preview, переименованы из StableValue), Primitive Types in Patterns, PEM Encodings и вечный Vector API (11-й incubator).

Release Notes со списком JEP здесь.

3-х минутный видео обзор здесь.

Для тех кто любит почитать
  • 500: Prepare to Make Final Mean Final. При изменении final поля с помощью рефлексии будет выводиться предупреждение. Подготовка к выходу в будущем integrity by default.

  • 504: Remove the Applet API. Удаление Апплетов, которые были помечены на удаление еще в JDK 17. 🪦 RIP Java Applets (1995–2026).

  • 516: Ahead-of-Time Object Caching with Any GC. AOT кеш теперь будет доступен при использовании любого сборщика мусора.

  • 517: HTTP/3 for the HTTP Client API. Добавили поддержку HTTP версии 3 в HTTP Client API.

  • 522: G1 GC: Improve Throughput by Reducing Synchronization. Улучшена пропускная способность приложения при использовании G1, за счет уменьшения количества синхронизаций между потоками приложения и потоками сборщика мусора.

  • 524: PEM Encodings of Cryptographic Objects (Second Preview). На второе превью ушло добавление API для Privacy-Enhanced Mail (PEM). PEMRecord переименовали в PEM. Метод EncryptedPrivateKeyInfo::encryptKey() переименован в encrypt() и теперь принимает DEREncodable вместо PrivateKey. PEMEncoder и PEMDecoder теперь поддерживают расшифровку KeyPair и  PKCS8EncodedKeySpec.

  • 525: Structured Concurrency (Sixth Preview). На шестое превью ушло structured concurrency. Добавили метод onTimout() для Joiner, он описывает что вернуть если вычисление выпало за время выполнения. Метод Joiner::allSuccessfulOrThrow() теперь возвращает список результатов, вместо стрима сабтасков. Метод Joiner::anySuccessfulResultOrThrow() переименовали в anySuccessfulOrThrow(). Статический метод open теперь принимает UnaryOperator вместо Function.

  • 526: Lazy Constants (Second Preview). На второе превью ушли LazyConstants, бывшие StableValues. В новом превью удалили методы orElseSet, setOrThrow, trySet, function и intFunction. Все  API взяло курс на более высокоуровневые сценарии использования.

  • 529: Vector API (Eleventh Incubator). Vector API ушло на 11 инкубатор. Изменений нет, JEP ждет Project Valhalla. 

  • 530: Primitive Types in Patterns, instanceof, and switch (Fourth Preview). На четвертое превью ушла доработка примитивов для использования их в паттернах, instanceof и switch. Доработки в основном касаются определения компилятором проблем при приведении типов, чтобы не было случайного обрезания int до short например.

Роман Краснослабодцев

 Vector API - 11-й incubator, это стиль. Vector API находится в incubator с Java 16 (2021). Пять лет, одиннадцать итераций. Для контекста - за это время Spring успел выпустить две мажорные версии. Говорят, Vector API выйдет из incubator, когда Project Valhalla будет готов. А Valhalla готов будет... когда будет готов.

JEP 198: Light-Weight JSON API был заменен на JEP draft: Convenience Methods for JSON Documents. Замена произошла по причине устаревания, первоначальный JEP был представлен аж в 2014 году. За это время успела преобразится как Java так и ее экосистема, поэтому проект решили переосмыслить. Новый JEP нацелен на представления удобных методов для работы с JSON. Важно понимать что цель сделать API, которое без особых заморочек позволит работать с JSON, основной пример который приводят, это получение данных из отдельных полей JSON объекта. Преобразовывать JSON в POJO как это делает Jackson новое API не сможет, поэтому речи о замене библиотек которые работают с JSON не идет, но JEP должен облегчить разработку и поддержку таких библиотек.

Вышла IntelliJ IDEA 2026.1 

Из интересных фичей:

  • Поддержка Java 26: новые функции для работы с Lazy Constants, live-template sts для Structured Concurrency и т.д. Подробнее в практическом гайде: какие фичи поддержаны, какие инспекции добавлены, как включить preview features.

  • Добавлен ACP Registry. Этот инструмент позволяет легко устанавливать ИИ-агентов из доступных в реестре. Такие как Junie, Claude Agent, Codex, GitHub Copilot и т.д;

  • Прокачали “Tab Tab”. Теперь IDE интеллектуально анализирует файл и предлагает изменения в связанных местах, а не только там, где сейчас находится курсор;

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

  • Исходный код всех зависимостей теперь будет по умолчанию скачиваться;

  • Command completion (он же ..). Теперь доступен для properties-файлов. Так же в него добавили ИИ-функции;

  • Для Gradle-скриптов реализована поддержка Gradle Best Practices, которые JetBrains выработали совместно с командами Google и Gradle;

  • Реализована поддержка Git worktrees, которая позволяет одновременно работать в нескольких ветках без необходимости переключаться между ними явно;

  • Анимация перемещения каретки теперь более плавная. Также у выделения теперь закруглённые углы. Красивое 🙂

Интересные видео

Михаил Поливаха — Spring AOT: кодогенерация на стероидах

Долгий старт приложений на Spring - это распространённая проблема. Особенно в больших проектах. Связано это с тем, что при каждом запуске Spring формирует свой контекст - ищет бины, генерирует для них прокси, подтягивает конфигурации и прочее. Михаил Рассказывает о Spring AOT, который выносит формирование контекста на этап сборки. Это дает весомые преимущества:

  • Можно посмотреть, сгенерированный код, что упрощает отладку;

  • Ускорение старта. Особенно если использовать в связке AppCDS;

  • Уменьшение потребления памяти в хипе

Впрочем при этом накладывается серьёзное ограничение - контекст не сможет меняться в рантайме с помощью @Conditional, @Profile и т.д. Таким образом, если ваш контекст зависит от окружения, то необходимо держать разные сборки под каждое из этих окружений.

Полезные статьи

Spring Boot 4 & Spring Framework 7 - What's New. 

Baeldung, как обычно, на высоте. Разбирают REST API Versioning, JSpecify-аннотации, встроенный resilience (retry, throttling), Jackson 3 и модульную автоконфигурацию. Помимо этого, важный акцент сделан на cloud-native подходе: обновлённый стек наблюдаемости (Micrometer + OpenTelemetry) и улучшенная поддержка AOT/native images, отказ от устаревших зависимостей и упрощение конфигурации. В общем, рекомендуем к прочтению.

JDK 26 Security Enhancements

JDK 26 продолжает два больших курса: подготовка к постквантовой эпохе (ML-DSA в jarsigner, HPKE с планами на PQ) и зачистка устаревшей криптографии (3DES, JKS, AffirmTrust, XPath-фильтры). Разработчикам стоит проверить, не используют ли их приложения алгоритмы, которые скоро отключат.

Главные изменения

1. HPKE - гибридное шифрование с открытым ключом. JDK 26 получил поддержку HPKE (RFC 9180) - современной схемы шифрования, которая комбинирует три алгоритма (KEM + KDF + AEAD) в одну связку. Работает через знакомый Cipher API с новым HPKEParameterSpec. HPKE уже активно используется «в дикой природе» - это основа шифрования в протоколе ECH (Encrypted Client Hello) для TLS 1.3, который прячет SNI от наблюдателей. Также HPKE лежит в основе MLS (Messaging Layer Security) - нового протокола для групповых мессенджеров. Пока поддержаны только классические алгоритмы, постквантовые обещают добавить позже.

2. PEM API (второй preview) - JEP 524

Наконец-то в Java появляется нормальный API для работы с PEM-файлами: PEMEncoder и PEMDecoder. Раньше для банальной операции «прочитать сертификат из PEM-строки» приходилось писать кучу бойлерплейта с CertificateFactory и ByteArrayInputStream. Теперь - две строки. По словам авторов блога Oracle Java Security, PEM API был одной из самых запрашиваемых функций по опросам JCE-сообщества.  Разработчики годами оборачивали это своими утилитами или тянули BouncyCastle ради одного метода.

 3. ML-DSA для подписи JAR-файлов

Постквантовый алгоритм цифровой подписи ML-DSA (FIPS 204, бывший CRYSTALS-Dilithium) теперь можно использовать для подписи JAR-файлов через jarsigner. ML-DSA - один из первых алгоритмов, стандартизированных NIST в рамках постквантовой криптографии. Его подписи значительно больше классических (~2.5 КБ для ML-DSA-65 против ~72 байт для Ed25519), но он устойчив к атакам квантового компьютера.

Secure, Scalable JVM Diagnostics for Kubernetes with JMS 

Java в Kubernetes - это 82% контейнерных сред в продакшене (данные CNCF 2026). Но Kubernetes видит только инфраструктуру: CPU, память, здоровье подов. А что происходит внутри JVM - GC-паузы, аллокации, lock contention - остается слепым пятном.

Статья описывает Java Management Service (JMS) от Oracle Cloud. Идея простая: в кластер ставится агент, который сам находит Java-контейнеры через Kubernetes API, запускает JFR-записи без JMX и shell-доступа, а результаты складывает в Object Storage. Всё управляется из одной консоли.

Проблематика

Раньше для диагностики подключались к JVM через JMX или jcmd. Но в микросервисах это не работает: подов сотни, они эфемерные, shell-доступ закрыт, JMX-порты заблокированы.

Можно запустить JFR по всем подам одной кнопкой, автоматически триггерить запись при скачке CPU, или настроить автоматический сбор диагностики после каждого деплоя для поиска регрессий.

Про масштаб: одна суточная JFR-запись это 1-2 ГБ на под. Сто подов - 200 ГБ диагностики. Руками такое не разгребёшь.

Кстати, сам JDK Flight Recorder работает с оверхедом меньше 1%. Изначально это была коммерческая фича BEA JRockit, потом перешла в Oracle JDK, и только в 2018 её открыли вместе с OpenJDK.

Нюанс: JMS привязан к Oracle Cloud. Для других облаков есть альтернативы, например Cryostat от Red Hat.

Deep dive into the API Versioning in Spring Boot 4.0

Небольшая статейка про версионирование API, которое появилось в Spring Boot 4.0. Новый API добавляет стандартные инструменты для версионирования API. Поддерживаются 4 стратегии версионирования:

  • версионирование URI путей - /api/v1/employees,/api/v2/employees

  • версионирование с помощью заголовков -  API-Version: 1.1

  • версионирование с помощью параметров запроса - /api/employees?version=1.1

  • версионирования с помощью типа медиа - Accept: application/vnd.myapp.v2+json

С помощью конфигурации задается нужная стратегия, а для указания версии нужно просто добавить атрибут version для @GetMapping, @PostMapping, @RequestMapping и им подобным. 

Поддержка версионирования появилась в RestClient и WebClient, а также у их тестовых собратьев RestTestClient и WebTestClient.

Также теперь с помощью конфигурации можно настроить стандартные заголовки Deprecation, Sunset, и Link для указания клиентам о том что указанная версия апи устарела.

How is Leyden improving Java Performance

Цикл статей, представляющий из себя глубокое погружение в Project Leyden, который сфокусирован на ускорении времени старта и прогрева JVM. Автор рекомендует всем начать пробовать использовать новые возможности, если в приложении уже используется JDK 25.

Первая статья в цикле описывает и текущие проблемы Java и откуда они появились, а вместе с этим и мотивацию самого проекта Leyden.

Вторая статья показывает то, как использовать новые возможности Leyden на практике, включая AOT-оптимизации и training run (для которых автор рекомендует использовать канареечные релизы). Также приводятся результаты тестов, по которым хорошо видно ускорение времени старта и более быстрый выход на пиковую производительность.

Третья статья подробнее раскрывает внутреннее устройство Leyden - как именно работает комбинация AOT и JIT, и за счёт чего достигается ускорение. Также автор рассказывает про инструменты, позволяющие оценить эффект от использования Leyden и дотюнить приложение, чтобы получить максимальную выгоду от Leyden.

Managing Native Memory in Java: Arenas, Malloc, and Custom Pools

​​Статья разбирает работу с нативной памятью в Java через FFM API, который заменяет JNI и Unsafe. На примерах показано, как выделять и освобождать память (через Arena, malloc/free, пулы), и какие трейдоффы это за собой влечет: стандартные Arena дают разумный баланс между безопасностью и контролем, но при переходе к ручному управлению (malloc или собственные пулы) приходится брать на себя все риски - от утечек до выхода за границы.

О размерах пула соединений

Перевод поста About Pool Sizing. Выбор размера пула соединений к БД - один из тех вопросов, которым рано или поздно задаётся большая часть бэкенд-разработчиков. В статье приводятся простые и очень полезные рекомендации. Автор разъясняет, на какие параметры железа нужно смотреть, в частности:

  • Количество ядер CPU. Основной параметр. Помним, что количество параллельно выполняемых задач не может быть больше количества ядер. Однако это не значит, что размер пула нужно устанавливать равным числу ядер. Ведь есть объективные блокеры для выполнения операций, а именно…   

Диск и сеть. Для доступа к данным, необходимым конкретной задаче с диска, а также для вычитывания их по сети нужно время. И именно в этот момент простоя ОС может переключиться на выполнение другой задачи;

Подробности

Исходя из этих параметров выводится соответствующая формула:

соединения = ((число_ядер * 2) + эффективное_число_шпинделей_HDD)

Причем в случае хорошего SSD и сети второй коэффициент может не играть такой уж большой роли. Таким образом, для машины на 4 CPU может вполне хватить пула на 10 соединений.

Также рассматривается сценарий блокировки пула, при котором клиентское приложение может захватывать несколько соединений для выполнения конкретной задачи. Для такого случая также приводится формула вычисления оптимального размера пула. Однако рекомендуется прежде всего посмотреть в сторону оптимизации приложения.

Любопытные подкасты

Foojay Podcast #92: Java 26 Is Here. Что нового, что удалили, и почему это важно в 2026. Отличный обзор от Friends of OpenJDK. Выпуск, посвящённый разбору свежего релиза Java 26 и ключевых изменений, которые он приносит в экосистему. В эпизоде обсуждаются новые JEP, улучшения производительности, изменения в языке и JVM, а также то, как эти нововведения повлияют на повседневную работу разработчиков и развитие платформы в целом.

Episode 52 “Carrier Classes & Discussing Syntax” [AtA]

В подкасте обсуждают свежие идеи из Project Amber - это проект в OpenJDK, который занимается развитием самого языка Java. Именно оттуда пришли записи (records), sealed classes, pattern matching и другие штуки, которые делают Java менее многословной.

Конкретно в этом выпуске говорят про carrier classes. Суть идеи: записи (records) дали Java много удобств, но они жестко ограничены. А что если дать обычным классам часть этих суперспособностей? В первую очередь речь про деконструкцию - возможность разобрать объект на части.

Пример

Например, с record уже сейчас можно написать так:

record Point(int x, int y) {}
if (obj instanceof Point(int x, int y)) {
	System.out.println(x + y);
}
// Java сама разбирает Point на x и y прямо в условии. Или в switch:
switch (shape) {
	case Circle(double r) -> Math.PI * r * r;
	case Rectangle(double w, double h) -> w * h;
}

Но с обычными классами так нельзя, приходится доставать поля руками через геттеры. Идея carrier classes в том, чтобы обычный класс тоже мог сказать "вот так меня можно разобрать на части" и работать в pattern matching. Без переписывания всего на record.

Гость выпуска - Брайан Гетц, главный архитектор языка Java в Oracle. Обсуждают два письма из рассылки Project Amber, где эта идея описывается, и как она менялась. Ещё затрагивают тему почему споры о синтаксисе обычно ни к чему не приводят. Записывали перед ужином на JavaOne.

Просто интересное

Quarkus has great performance – and we have new evidence

Ребята из кваркуса обновили и доработали графики производительности, которые располагались в самом низу их главной страницы. Теперь они сравниваются напрямую со Spring, добавили график с информацией о пропускной способности, а также информацию о последнем запуске бенчмарка, но самое важное - теперь есть ссылка на open-source репозиторий с бенчмарком. Теперь каждый желающий может прогнать бенчмарк и внести какие-то изменения если видит недочеты в текущей имплементации.

Джавовые события

С 17 по 19 марта прошла конференция JavaOne, уже доступно несколько записей JavaOne 2026 Live Streams - Dev.java.

JPoint 2026 - 29–30 апреля, Москва + онлайн. jpoint.ru - крупнейшая Java-конференция в России.

Свежие релизы

Вышли maintenance-релизы Spring Framework 7.0.6 и 6.2.17 - стабильность и баг-фиксы. Spring Boot 4.0.4 - аналогично, патчи и обновления зависимостей.

А вот третий milestone Spring Boot 4.1.0-M3 интереснее: появилась автоконфигурация для AMQP 1.0 (включая AmqpConnectionFactory и AmqpClient), а также новый модуль spring-boot-batch-data-mongo для Spring Batch поверх MongoDB. 


Spring AI 2.0.0-M4: AI-движуха

Четвёртый milestone вышел 26 марта - одновременно с патчами 1.1.4 и 1.0.5. Суммарно 51 улучшение через три ветки. Из вкусного: Redis-based semantic cache advisor - кэширование семантически похожих запросов, чтобы не дёргать LLM по каждому чиху (и не тратить доп.деньги). Structured output через JSON Schema для Mistral AI, дефолтная модель OpenAI обновлена до gpt-5-mini. Закрыты четыре CVE. GA запланирован на 28 мая 2026 с базой на Spring Boot 4.0, JSpecify null-safety и Jackson 3.


Gradle 9.4.0 и 9.4.1: свежие версии получили поддержку JDK 26, улучшения отчётности по тестам через кастомную реализацию JUnit TestEngine и доработки кэша конфигурации с поддержкой нескольких lambda-выражений. Ничего революционного, но если вы обновляетесь на JDK 26 — обновите и Gradle, иначе билд может огорчить.


LangChain4j 1.12.1 принесла новый HibernateEmbeddingStore - интеграцию с Hibernate ORM и модулем hibernate-vector для хранения эмбеддингов прямо в вашей реляционной базе. Класс MicrometerChatModelListener обзавёлся счётчиками и таймером латентности. Для тех, кто строит RAG-пайплайны на Java без Spring AI - LangChain4j остаётся отличной альтернативой с активным сообществом.


Micronaut 4.10.10 принёс фикс двух DoS-уязвимостей при обработке JSON и HTML-ошибок. Если вы на Micronaut - обновляйтесь, тут без вариантов. Keycloak 26.5.5 закрыл целый букет CVE: обход аутентификации, уязвимости identity provider и проблемы с SAML broker login.

Спасибо за прочтение! Ждём вашу обратную связь в комментариях. Увидимся через месяц 😉

Присылайте материалы, если встретили что-то интересное - опубликуем в следующем выпуске!