Чашечка Java
8.36K subscribers
3.93K photos
13 videos
56 files
6.4K links
Лучшие материалы по Java на русском и английском

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels
Download Telegram
JDK 28: простой API для чтения и создания JSON

Для JDK 28 интегрировали JEP 540: модуль jdk.incubator.json позволит работать с JSON без внешней библиотеки. Метод Json.parse() строит дерево JsonValue, по которому можно переходить через get() и извлекать значения нужного типа.

Такой API пригодится, например, для разбора ответа REST-сервиса или создания небольшого JSON-документа в утилите. Область задач ограничена: автоматического преобразования Java-объектов в JSON и потокового разбора в нём нет.

API находится в стадии инкубации, а JDK 28 доступен в ранних сборках. Для существующего приложения на Jackson переход потребует оценки того, какие возможности оно использует.

Описание и примеры JEP 540
JDK 28: маленькие аллокации Arena.ofConfined() станут дешевле

Для будущего JDK 28 подготовили оптимизацию FFM API: небольшие выделения нативной памяти в Arena.ofConfined() смогут обслуживаться из переиспользуемых пулов. По умолчанию кэш платформенного потока хранит до четырёх пулов по 64 байта.

Пул выдают арене при подходящей аллокации. При закрытии использованную память обнуляют; пул возвращают в кэш либо освобождают, если кэш полон. Сегменты закрытой арены остаются недоступными. Крупные запросы и неподходящее выравнивание используют обычный путь выделения памяти.

Оптимизация работает и с виртуальными потоками: пул берётся у несущего потока и затем принадлежит арене. Переписывать вызовы API не требуется. Выигрыш в JMH измерен для маленьких аллокаций; ускорение всего приложения зависит от его нагрузки.

Устройство пулов и результаты замеров
👏1😁1
Spring Boot 4: настройка сервера авторизации и проверка токенов

Spring Authorization Server вошёл в Spring Security 7 и следует его циклу релизов. Он выдаёт клиентским приложениям токены доступа по OAuth 2.1 и поддерживает OpenID Connect 1.0 для идентификации пользователей.

В руководстве по настройке сервера показаны регистрация клиента через свойства приложения и проверка токенов в HTTP-клиенте IntelliJ. Authorization Code разбирается на примере входа пользователя с подтверждением разрешений. Client Credentials используется для обмена между приложениями без участия пользователя. Затем автор добавляет в JWT, токен с полями данных, список полномочий под именем aut.

Пример хранит пользователей в памяти. Для промышленной эксплуатации автор рекомендует внешний сервис управления пользователями и входом, например Keycloak или Okta.

#spring #java
Маршрутизатор запросов к моделям на Spring AI TypeSafe

Spring Boot 4.1.1 и стартер Spring AI TypeSafe 0.1.0: в туториале запрос сначала получает оценку сложности, затем направляется к выбранной модели. Приветствие и задача по проектированию архитектуры могут требовать разных моделей.

В разборе сборки маршрутизатора с нуля четыре уровня моделей описаны в enum. Jev, модель для структурированных решений, получает запрос и выбирает уровень по этим описаниям. Вместе с выбором возвращаются оценка уверенности и вероятности для каждого уровня: по ним можно смотреть, как изменения описаний влияют на решение.

Для маршрутизатора достаточно стартера. Без свойства spring.ai.typesafe.api-key он не создаст бин TypeSafeClient. Проект пока находится в Spring AI Community и не входит в основной репозиторий Spring AI.

#spring #java
Какими ИИ-ассистентами и агентами вы пользуетесь? Можно выбрать несколько
Anonymous Poll
8%
GitHub Copilot
1%
Codeium
47%
Claude Code
24%
Gemini
48%
ChatGPT
4%
GigaCode (Сбер)
3%
Yandex Code Assistant
29%
DeepSeek
5%
Hermes Agent
12%
Другое (напишу в комментариях)
Read. Write. Edit. Bash.

Это базовый набор операций Pi — агента, на котором построен OpenClaw. Дополнительные возможности появляются через расширения: агент может написать их по запросу пользователя, перезагрузить и проверить в работе.

У такого устройства есть полезные детали:
• состояние расширений хранится в сессии;
• беседу можно разветвить для отладки и вернуться с кратким пересказом;
• инструкции и примеры помогают агенту создавать новые функции.

Армин Ронахер разбирает Pi на собственных примерах: среди расширений, созданных по его запросам, есть список задач и ревью изменений кода. Получается взгляд на выбор ИИ-инструмента через то, что пользователь может настроить в нём под свою работу.

#ии #инструменты
Регистрация плагинов по списку через BeanRegistrar в Spring Framework 7

Spring Framework 7 и Spring Boot 4 позволяют программно регистрировать бины через BeanRegistrar. В руководстве по подключению плагинов разобран пример приложения, где набор плагинов задаётся списком в настройках.

Регистратор читает свойства app.plugins[0], app.plugins[1] и далее через Environment, пока не встретит отсутствующее значение. Затем сопоставляет имена плагинов с классами и регистрирует их через BeanRegistry. Подключение самого регистратора показано через @Import.

Автор отмечает, что для большинства случаев условной регистрации бинов, по его мнению, достаточно аннотаций семейства @ConditionalOn….

#spring #java
В Spring включён стандартный режим транзакций через прокси. Контроллер вызывает метод submit сервиса без активной транзакции. Метод submit без аннотаций вызывает публичный метод save того же объекта, помеченный @Transactional. Каковы границы транзакции сервиса?
Anonymous Quiz
29%
Транзакция охватывает только выполнение save
16%
Транзакция охватывает submit целиком
49%
Транзакция сервиса не открывается
7%
Вызов save завершается IllegalTransactionStateException
Чашечка Java
Развёрнутое пояснение:

1. Контроллер обращается к сервису через прокси Spring; активной транзакции в этот момент нет.

2. Для метода submit транзакционные настройки не заданы, поэтому прокси передаёт управление объекту сервиса без открытия транзакции.

3. Метод submit напрямую вызывает save у того же объекта. Такой вызов не проходит через прокси, который применяет транзакционные настройки.

4. Аннотация
@Transactional на save сама по себе не запускает транзакцию: в режиме прокси её должен обработать перехватчик Spring. Поэтому транзакция сервиса не открывается, а отсутствие транзакции само по себе не вызывает указанного исключения. Отдельные операции репозитория могут иметь собственные транзакционные границы.

Почему это важно

Задача проверяет понимание прокси и декларативного управления транзакциями Spring. При обработке заказа такой внутренний вызов может оставить несколько записей без общей транзакции: сбой поздней операции не обязательно отменит предыдущие. Если все операции submit должны быть атомарными, транзакционную границу можно задать на submit; если нужна отдельная граница для save, его можно вынести в другой сервис и вызывать через прокси.
Вызов диагностических команд JVM из Java без запуска jcmd

Каждый запуск jcmd создаёт новую JVM. Если вы встраиваете диагностику в собственный Java-инструмент, команды можно вызывать через JMX, встроенный механизм управления JVM.

В руководстве по вызову DiagnosticCommand разобрано подключение к работающей JVM через Attach API: запуск локального агента управления, получение MBeanServerConnection и вызов команды через invoke. Пример получает параметры JVM и команду запуска Java-приложения.

Имена команд нужно преобразовать: VM.command_line становится vmCommandLine. В статье есть функция преобразования и полный код вызова. Пример пока не поддерживает аргументы диагностических команд.

#java #jvm
👍1
Spring Framework 7: настройка повторов при сбоях

В Spring Framework 7 и Spring Boot 4 повторы доступны без отдельной зависимости spring-retry. В разборе настройки повторов показаны два способа: аннотация @Retryable на методе и программный вызов через RetryTemplate.

При миграции @EnableRetry заменяется на @EnableResilientMethods. Меняется и подсчёт вызовов: прежний maxAttempts = 6 включал первую попытку, а новый maxRetries = 5 задаёт только повторы. Общее число попыток остаётся тем же.

В примерах множитель задержки 2 увеличивает паузы до 1, 2, 4, 8 и 16 секунд, а jitter добавляет случайное отклонение. Для программного варианта показана сборка RetryPolicy и выполнение вызова через RetryTemplate.execute(). Повторы не заменяют поиск причины сбоя.

#spring #java
😁1